在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ js怎樣確定兩個異步函數(shù)的執(zhí)行順序

js怎樣確定兩個異步函數(shù)的執(zhí)行順序

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

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

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

輸出

// promise
// settimeout

請問兩個都是異步的函數(shù),為什么setTimeout函數(shù)后執(zhí)行?

回答
編輯回答
糖果果

Promise 是microtask 隊列
而setTimeout屬于 macrotask 隊列
在一個Tasks執(zhí)行之后會立刻執(zhí)行microtask隊列,而后執(zhí)行macrotask隊列
macrotask永遠在 microtask 之后執(zhí)行

2018年3月18日 07:39
編輯回答
我以為

setTimeout并不是真正的異步操作,只是把想執(zhí)行的代碼放到UI隊列中,在未來執(zhí)行。
http://blog.csdn.net/qingwenx...

2018年7月21日 07:58
編輯回答
陌顏

因為 .then 回調(diào)要比 setTimeout(fn,0) 早觸發(fā),優(yōu)先級比 setTimeout 高,內(nèi)部類似用了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 是同步執(zhí)行的,這是規(guī)范就定義好了的,然后這里的 fn 同步 resolve 了,那么 then 注冊的回調(diào)會在下一個 tick 被執(zhí)行,甚至比已經(jīng)注冊的 setTimeout(fn, 0) 還早。

2017年3月4日 06:24
編輯回答
初念

設(shè)置了setTimeout函數(shù)會放在最后執(zhí)行

2018年3月22日 14:56
編輯回答
解夏

貼個知乎鏈接慢慢看。。。

2017年8月28日 23:51