hg_*_*git 20 javascript asynchronous node.js ecmascript-2017
我正在努力学习async-await.在这段代码中 -
const myFun = () => {
let state = false;
setTimeout(() => {state = true}, 2000);
return new Promise((resolve, reject) => {
setTimeout(() => {
if(state) {
resolve('State is true');
} else {
reject('State is false');
}
}, 3000);
});
}
const getResult = async () => {
return await myFun();
}
console.log(getResult());
Run Code Online (Sandbox Code Playgroud)
为什么我得到输出 -
Promise { <pending> }
Run Code Online (Sandbox Code Playgroud)
而不是一些价值?getResult()功能等待myFun()功能不应该解决它的承诺值吗?
Ben*_*une 19
如果您使用的是async/await,则所有调用都必须使用Promises或async/await.你不能只是神奇地从同步调用中获得异步结果.
你的最后一次电话需要是:
getResult().then(response => console.log(response));
Run Code Online (Sandbox Code Playgroud)
或类似的东西:
(async () => console.log(await getResult()))()
Run Code Online (Sandbox Code Playgroud)
小智 5
您需要了解的是async / await不会使您的代码同步运行,但让您像这样编写它:
简而言之:前面带有async的函数实际上是异步执行的,因此关键字为“ async”。而“ await”关键字将使在此异步函数中使用它的行在执行过程中等待promise。因此,尽管该行正在等待,但整个函数仍将异步运行,除非该函数的调用者也“唤醒”了...
更详细地解释:当您将async放在函数前面时,实际上所做的是使它以函数内部返回的内容返回promise。该函数异步运行,当执行return语句时,promise解析返回值。
含义,在您的代码中:
const getResult = async () => {
return await myFun();
}
Run Code Online (Sandbox Code Playgroud)
函数“ getResult()”将返回一个Promise,该Promise将在执行完成后解决。因此,除非您告诉调用getResult()的函数也要对其“等待”,否则getResult()函数内的各行将异步运行。在getResult()函数内部,您可能会说它必须等待结果,这会使getResult()的执行等待其解决承诺,但是getResult()的调用者不会等待,除非您还告诉调用者'await '。
因此,解决方案将调用以下任一方法:
getResult().then(result=>{console.log(result)})
Run Code Online (Sandbox Code Playgroud)
或者在其他功能中使用时,只需再次使用“等待”
async callingFunction(){
console.log(await(getResult());
}
Run Code Online (Sandbox Code Playgroud)