Javascript 如果resolve(…)在setTimeout内,如何等待承诺解析?

Javascript 如果resolve(…)在setTimeout内,如何等待承诺解析?,javascript,asynchronous,async-await,stack,queue,Javascript,Asynchronous,Async Await,Stack,Queue,下面代码的执行顺序是什么 如果wait使我们等待“promise”解析,但resolve(…)在setTimeout内,并且setTimeout只在堆栈为空后执行。。。我们怎么能不在等待中僵住?当我们“等待”的时候,堆栈上不是还有东西吗?wait-y setTimeout是否有异常,或者我不理解堆栈 async function f() { let promise = new Promise((resolve, reject) => { setTimeout(() =>

下面代码的执行顺序是什么

如果wait使我们等待“promise”解析,但resolve(…)在setTimeout内,并且setTimeout只在堆栈为空后执行。。。我们怎么能不在等待中僵住?当我们“等待”的时候,堆栈上不是还有东西吗?wait-y setTimeout是否有异常,或者我不理解堆栈

async function f() {

  let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve("done!"), 1000)
  });

  let result = await promise; // wait until the promise resolves (*)

  alert(result); // "done!"
}


f();


await
基本上是
的替代品。然后
——它说“只有在承诺解决后,才能做剩下的事情”。它不会在
等待
时冻结解释器-它只会暂停当前函数的执行流,直到承诺解决为止

所以

可能更准确地理解为

// pause execution of this function until the promise resolves (*)
当我们“等待”的时候,堆栈上不是还有东西吗

是,
f()
在等待解析
等待承诺时同步返回承诺(来自异步函数)。然后脚本不执行任何其他操作,因此调用堆栈完全为空,直到
setTimeout
宏任务在一秒钟后运行,添加一个调用
resolve
的短任务,该任务将对一个微任务进行排队,该微任务很快会导致
done
被记录


在编写代码的过程中,有很多次没有当前活动的任务。

嘿,谢谢你的回复-这很有帮助。所以如果在我的代码的最后一行之后有更多的代码(在“f();”下面的代码)-在等待承诺得到解决之前是否必须执行这些代码?如果是这样的话,是不是因为“let result=wait…”和.then处理程序一样,以及setTimeout?如果你有时间,你能告诉我哪些是“在你的代码中没有当前活动任务的次数”。很抱歉问了这么多问题,你已经帮了我很大的忙了。一旦在函数内到达
wait
,函数将暂停,并(1)等待其下的所有其他同步代码完成(2)等待超时生成新的宏任务(3)当宏任务运行时,调用
resolve
,将新任务添加到队列中,它在所有其他同步代码运行后不久运行暂停时间介于(1)和(2)之间(例如0.5秒后,等待超时),以及介于(2)和(3)之间(在调用
resolve
后,调用堆栈上没有任何内容。然后,一个单独的任务(Promise的微任务)运行并继续执行,导致运行
警报(结果);
// pause execution of this function until the promise resolves (*)