在自定义 Promise 上使用异步等待

问题描述 投票:0回答:3

我尝试在返回承诺的函数上使用异步等待,但我得到的输出是

Promise { <pending> }
。在这里,我使用名为 ConvertFiletoPDF 的函数,它返回一个承诺。我需要获取输出(我在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);
javascript promise async-await
3个回答
8
投票

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

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

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;
}

// (In a module you wouldn't need this wrapper)
(async() => {
    try {
        let res = await myfunc("some file");
        console.log(res);
    } catch (e) {
        // Deal with the fact there was an error
    }
})();

或与

then
catch
:

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 开始通过
libuv
机制等待来自
event loop
新创建的线程结果。所以,Javascript 说,“那个是异步的,我不会等待,当它完成时它会让我知道,我将运行我的
then
回调,然后我将继续其输出。”

Javascript信守诺言。尝试运行下一行。

myFunch
仍在工作。输出尚未准备好。返回未定义。

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

你变得不确定。


0
投票

有人可能会发现我的代码中的这个示例很有用。您可以将其包装在 Promise 中,然后解析自定义 Promise,然后调用另一个 Promise 来确认收到原始 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),
    );
});
© www.soinside.com 2019 - 2024. All rights reserved.