首页 文章

在自定义承诺上使用async await

提问于
浏览
3

我试图在一个返回一个promise的函数上使用异步等待,但是我得到的输出是 Promise { <pending> } . 在这里我使用名为convertFiletoPDF的函数返回一个promise . 我需要获取输出(我在resolve()中提到的路径) . 当我用它时

convertFiletoPDF(file).then((result) => {
  console.log(result);
}).catch((err)=>{
  console.log(err);
});

它给出了预期的结果 . 下面的代码有什么问题?我对这些异步等待和承诺相当新 .

function convertFiletoPDF(file) {
  return new Promise(function(resolve, reject) {
    unoconv.convert(file, "pdf", function(
      err,
      result
    ) {
      if (err) {
        reject(err);
      }
      let File = file.substring(file.lastIndexOf("/")+1,file.lastIndexOf("."));
      // result is returned as a Buffer
      fs.writeFile(__dirname+"/files/converted/"+File+".pdf", result, error => {
        /* handle error */
        if (err) reject(error);
        else resolve("./files/converted/"+File+".pdf");
      });
    });
  });
}

async function myfunc(file){
  let res = await convertFiletoPDF(file);
  return res;
}

let res = myfunc(file);
console.log(res);

3 回答

  • 5

    async 函数的返回值是一个承诺,所以你的 console.log 输出自然就是这样 . 您需要通过 await (在另一个 async 函数内)使用结果或使用 then / catch (在另一个 async 函数内) .

    这就是你目前正在做的事情:

    function convertFiletoPDF(file) {
      return new Promise(function(resolve, reject) {
        setTimeout(resolve, 400, "Done");
      });
    }
    
    async function myfunc(file){
      let res = await convertFiletoPDF(file);
      return res;
    }
    
    let res = myfunc("some file");
    console.log(res);
    

    你需要这样做:

    function convertFiletoPDF(file) {
      return new Promise(function(resolve, reject) {
        setTimeout(resolve, 400, "Done");
      });
    }
    
    async function myfunc(file){
      let res = await convertFiletoPDF(file);
      return res;
    }
    
    (async() => {
      try {
        let res = await myfunc("some file");
        console.log(res);
      } catch (e) {
        // Deal with the fact there was an error
      }
    })();
    

    thencatch

    function convertFiletoPDF(file) {
      return new Promise(function(resolve, reject) {
        setTimeout(resolve, 400, "Done");
      });
    }
    
    async function myfunc(file){
      let res = await convertFiletoPDF(file);
      return res;
    }
    
    myfunc("some file")
      .then(res => {
        console.log(res);
      })
      .catch(e => {
        // Deal with the fact there was an error
      });
    
  • 0
    convertFiletoPDF()
    

    此函数运行并返回Promise . 这可以 .

    myfunc()
    

    让我们说 myfunc 需要10秒钟 . Javascript开始通过 event loop 机制从 libuv 等待新创建的线程结果 . 所以,Javascript说,“那个是异步,我不会等待,当它完成它会让我知道,我将运行我的 then 回调,然后我将继续其输出 . ”

    Javascript信守承诺 . 试图在线下面运行 . myFunch 仍然有效 . 输出尚未准备好 . 返回undefined .

    let res = myfunc(file);
    console.log(res);
    

    你未定义 .

  • 0

    有人可能会从我的代码中发现这个例子很有用 . 您可以将其包装在承诺中,然后解析自定义承诺,然后调用另一个承诺以确认收到原始web3调用 .

    return new Promise((resolve, reject) => {
        tokenContract.methods.approve(
            exchangeAddress, 
            BIG_NUMBER_1e50
        )
        .send({ from })
        .once('transactionHash')
        .once('receipt', receipt => resolve(receipt))
        .on('confirmation')
        .on('error', err => reject(err))
        .then( receipt => // will be fired once the receipt its mined
            console.log(receipt),
        );
    });
    

相关问题