javascript async / await实际上如何工作?

时间:2019-07-23 08:57:04

标签: javascript asynchronous async-await

我有一些使用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”)的返回值。

1 个答案:

答案 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));