【发布时间】:2018-11-18 02:59:21
【问题描述】:
我在 JS 中测试异步代码的概念。在回调队列和微任务队列顺序之间感到困惑。每当 promise 对象被解析时,实现方法 { then } 被推送到微任务队列中,而浏览器计时器函数的回调(例如 setTimeout)被推送到回调队列中。每当调用堆栈变空时,事件循环会不断检查队列并将函数从队列推送到调用堆栈。事件循环应该更喜欢微任务队列而不是普通回调队列,但在示例中:https://jsfiddle.net/BHUPENDRA1011/2n89ftmp/ 否则会发生。
function display(data) {
console.log('hi back from fetch');
}
function printHello() {
console.log('hello');
}
function blockfor300ms() {
for (let i = 0; i < 300; i++) {
// just delaying logic
}
}
// this sets the printHello function in callback queue { event loop queue }
setTimeout(printHello, 0);
const futureData = fetch('https://api.github.com/users/xiaotian/repos');
// after promise is resolved display function gets added into other queue : Microtask queue { job queue}
futureData.then(display);
// event loop gives prefrence to Microtask queue ( untill its complete)
blockfor300ms();
// which runs first
console.log('Me first !')
预期输出
- 我先!
- 从 fetch 回来
- 你好
实际输出:
- 我先!
- 你好
- 从 fetch 回来
请告诉我这里的情况。
谢谢
【问题讨论】:
标签: javascript asynchronous event-loop