javascript - 下面代码的执行顺序以及为什么?

标签 javascript promise

主要是“promise2”和“async1 end”的顺序。我不知道为什么。

async function async2() {
  console.log("async2");
}
new Promise(resolve => {
  resolve(async2());
}).then(() => {
  console.log("async1 end");
});

new Promise(function(resolve) {
  console.log("promise1");
  resolve();
}).then(function() {
  console.log("promise2");
});

最佳答案

 resolve(async2());

与以下内容大致相同:

resolve(Promise.resolve())

因此它创建了一个将解决的 Promise,并将其传递给另一个 Promise 的解决方案。随着 Promise 变得扁平化(用 Promise 解决 Promise,将使外部 Promise 等待内部 Promise),您的示例可以简化为:

 Promise.resolve("first").then(console.log);

 Promise.resolve("second")
   .then(it => it) 
   .then(console.log);

现在保证 Promise 的解析是异步的,因此即使您像您的情况一样同步解析它,.then 回调也只会在 1 个刻度后调用。现在,第一个将在一个刻度后记录,第二个也将在一个刻度后解析,然后链式 Promise 将解析,然后等待另一个刻度,直到第三个刻度完成。

因此“promise2”将在一个tick后被记录,“async1 end”将在两个tick后被记录。

<小时/>

尽管如此,您不应该依赖 promise 的执行顺序。

关于javascript - 下面代码的执行顺序以及为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55279380/

相关文章:

javascript - 如何让 VsCode 从 es6 模块正确自动导入?

javascript - 在 onclick 中解决 Promise

node.js - CasperJS,与测试框架并行浏览

javascript - 为什么在 ES6 中使用 Promise 时,我的事件监听器在发生一个事件后不会持续?

javascript - 是否可以使用变量作为 dom 元素?

javascript - 在 CoffeeScript 中将函数作为参数传递

javascript - 剑道UI : define a schema for model with complex properties

javascript - 遍历大对象也返回空值

javascript - 从调用到获取的类型 Promise 是通用的吗?

Javascript Promise 问题,为什么 Chain 不起作用