我试图在一个返回一个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 回答
async
函数的返回值是一个承诺,所以你的console.log
输出自然就是这样 . 您需要通过await
(在另一个async
函数内)使用结果或使用then
/catch
(在另一个async
函数内) .这就是你目前正在做的事情:
你需要这样做:
或
then
和catch
:此函数运行并返回Promise . 这可以 .
让我们说
myfunc
需要10秒钟 . Javascript开始通过event loop
机制从libuv
等待新创建的线程结果 . 所以,Javascript说,“那个是异步,我不会等待,当它完成它会让我知道,我将运行我的then
回调,然后我将继续其输出 . ”Javascript信守承诺 . 试图在线下面运行 .
myFunch
仍然有效 . 输出尚未准备好 . 返回undefined .你未定义 .
有人可能会从我的代码中发现这个例子很有用 . 您可以将其包装在承诺中,然后解析自定义承诺,然后调用另一个承诺以确认收到原始web3调用 .