我有一些使用javascript async / await的代码:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function fun1()
{
console.log("dosomething1");
await sleep(6000);
console.log("dosomething2");
return "returnfromfun1";
}
console.log(fun1());
console.log("hello");
根据official document关于异步/等待的信息:
异步函数可以包含一个await表达式,该表达式会暂停 执行异步功能并等待传递的Promise 解决,然后恢复异步函数的执行和 返回解析值。
我期望以下输出:
dosomething1
//wait for 6 seconds
dosomething2
Promise { <state>: "fulfilled", <value>: "returnfromfun1" }
hello
但是实际输出是:
dosomething1
Promise { <state>: "pending" }
hello
//wait for 6 seconds
dosomething2
fun1似乎在“ await”行返回。我是否误解了官方文件中的描述?看来我永远都没有得到fun1(“ returnfromfun1”)的返回值。
答案 0 :(得分:3)
您必须稍微不同地阅读引用部分:
异步函数可以包含一个等待表达式,该表达式会暂停异步函数的执行
异步函数本身会暂停执行,然后调用它的函数会继续执行。
如果您想到的是同步调用栈,那么将会发生异步函数上下文被弹出并存储在其他地方的情况:
stack: [init] -> [async] fun1 -> sleep -> setTimeout
// The promise gets returned from sleep
stack: [init] -> [async] fun1
// The async function gets popped of
stack: [init]
hidden: [async] fun1
// synchronous execution ends
stack: -
hidden: [async] fun1
// the timer triggers, the promise gets resolved
stack: setTimeout callback
hidden: [async] fun1
// synchronous execution ends
stack: -
hidden: [async] fun1
// the promise resolves, the async fun1 context gets moved onto the stack
stack: [async] fun1
fun1似乎在“ await”行中返回
是的。在那一刻,它返回一个Promise,该Promise会在异步函数返回时(在一段时间继续执行之后)进行解析。
似乎我从没有得到fun1(“ returnfromfun1”)的返回值。
当诺言解决时,您可以得到它:
fun1().then(result => console.log(result));