Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript async/await实际上是如何工作的?_Javascript_Asynchronous_Async Await - Fatal编程技术网

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

javascript async/await实际上是如何工作的?,javascript,asynchronous,async-await,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 "ret

我有一些使用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");
根据关于异步/等待的说明:

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");
异步函数可以包含暂停函数的等待表达式 执行异步函数并等待传递的承诺 解析,然后恢复异步函数的执行和 返回已解析的值

我期望得到以下结果:

dosomething1
//wait for 6 seconds
dosomething2
Promise { <state>: "fulfilled", <value>: "returnfromfun1" }
hello
dosomething1
//等待6秒钟
dosomething2
承诺{:“履行”,:“从Fun1返回”}
你好
但实际产出是:

dosomething1
Promise { <state>: "pending" }
hello
//wait for 6 seconds
dosomething2
dosomething1
承诺{:“待定”}
你好
//等待6秒钟
dosomething2

fun1似乎在“等待”线上返回。我是否误解了官方文件中的描述?我似乎从未得到fun1的返回值(“returnfromfun1”)

您必须以稍微不同的方式阅读引用的部分:

异步函数可以包含一个等待表达式,用于暂停异步函数的执行

只是异步函数本身暂停执行,然后调用它的函数继续执行

如果您想到一个同步调用堆栈,那么会出现异步函数上下文弹出并存储在其他地方的情况:

 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似乎在“等待”线上返回

是的,没错。在那一刻,它返回一个承诺,该承诺在异步函数返回时解析(在它继续执行之后)

我似乎从未得到fun1的返回值(“returnfromfun1”)

当承诺解决时,您可以得到:

  fun1().then(result => console.log(result));

fun1
是异步的,所以只需使用
console.log(fun1())调用它即可
不会等待它的解决-或者
等待它,或者调用
。然后“根据官方文件”
在它上面-这是一个任何人都可以编辑的wiki,而不是官方文件。这里有官方文档:异步函数返回承诺。调用函数会立即同步返回未解析的承诺。承诺的结果可以在
.then()
中检索,例如
fun1。然后((result)=>{}
或者通过等待它,例如
var result=wait fun1()
。啊哈,那个文档太正式了,让我头痛,甚至只是瞥了一眼:)@jonaswillms这么认为,这几乎是一样的事情-
var result=foo()(在另一个问题中)不会等待异步操作完成,就像
console.log(fun1())这里不等待异步操作完成,尽管我猜还有@jonaswillms,你是说从fun1 at wait返回的Promise对象是在sleep函数中创建的吗?您是否可以指向一个授权文档,其中声明await将从当前异步函数返回,且函数创建的Promise对象位于await关键字之后?@william no,
fun1
将在内部创建一个Promise并返回该承诺。唯一的“权威文件”是规范,当然我可以引用相关部分,但我不认为这将有助于你目前的理解阶段(规范真的很难阅读),即使承诺不是由睡眠创造的,它一定是一个副本,对吗?因为承诺会在6秒后解决。不。当
sleep()
返回的承诺解析时,异步函数继续执行
return
s,并在内部解析该内部承诺。所以他们不是彼此的“复制品”。现在感觉好多了。非常感谢,乔纳斯威尔斯!