在自定义承诺上使用async await

时间:2017-10-01 16:44:39

标签: javascript promise async-await

我试图在一个返回一个promise的函数上使用async await但是out out im getting是 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 个答案:

答案 0 :(得分: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
  });

答案 1 :(得分:0)

convertFiletoPDF() 

此函数运行并返回Promise。这很好。

myfunc()

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

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

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

你未定义。

答案 2 :(得分: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),
    );
});