js怎样确定两个异步函数的执行顺序

const asyncFunction = function() {
  return new Promise(function(resolve, reject) {
    resolve('promise');
  });
};

asyncFunction().then(value => console.log(value));

setTimeout(() => { console.log('settimeout') }, 0);

输出

// promise
// settimeout

请问两个都是异步的函数,为什么setTimeout函数后执行?

阅读 8k
5 个回答

Promise 是microtask 队列
而setTimeout属于 macrotask 队列
在一个Tasks执行之后会立刻执行microtask队列,而后执行macrotask队列
macrotask永远在 microtask 之后执行

因为 .then 回调要比 setTimeout(fn,0) 早触发,优先级比 setTimeout 高,内部类似用了nodejs 的 progress.nextTick,插队插到 setTimeout(fn,0) 前面了。

即使你把 setTimeout(fn,0) 放到前面也一样:

setTimeout(() => { console.log('settimeout') }, 0);

const asyncFunction = function() {
  return new Promise(function(resolve, reject) {
    resolve('promise');
  });
};

asyncFunction().then(value => console.log(value));

首先, new Promise(fn) 这个 fn 是同步执行的,这是规范就定义好了的,然后这里的 fn 同步 resolve 了,那么 then 注册的回调会在下一个 tick 被执行,甚至比已经注册的 setTimeout(fn, 0) 还早。

设置了setTimeout函数会放在最后执行

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题