【发布时间】:2019-12-10 15:55:23
【问题描述】:
我在 HTML 文件中有以下代码:
const fooBar = function(resolve, reject) {
let flag = (Math.round(Math.random() * 10) % 2);
if(flag)
resolve({ "value": "foo", "rand": Math.random() });
else
reject({ "value": "bar", "rand": Math.random() });
};
const fooBarSuccess1 = function(value) {
console.log("Success 1:" + JSON.stringify(value));
};
const fooBarFailure1 = function(value) {
console.log("Failure 1:" + JSON.stringify(value));
};
const fooBarSuccess2 = function(value) {
console.log("Success 2:" + JSON.stringify(value));
};
const fooBarFailure2 = function(value) {
console.log("Failure 2:" + JSON.stringify(value));
};
new Promise(fooBar).then(fooBarSuccess1).catch(fooBarFailure1);
new Promise(fooBar).then(fooBarSuccess2, fooBarFailure2);
console.log("Before setting MicroTask.");
setTimeout(() => console.log("This Timeout was set before the MicroTask!"));
queueMicrotask(() => console.log("From MicroTask!"));
console.log("After setting MicroTask.");
当 Promise 被拒绝时,fooBarFailure1 在微任务队列的末尾执行,所以你可能会得到以下输出:
但是,不应该在queueMicrotask 内部的代码执行之前调用它吗?我没有看到fooBarFailure2 有任何此类问题。它按预期的顺序执行。结果在 Firefox 71 和 Google Chrome 78 中是一样的。谁能解释这里发生了什么?
【问题讨论】:
-
旁注:如果你想要一个在
true和false之间分割为 50/50 的标志,如果你愿意,你可以比上面更简单一点:let flag = Math.random() < 0.5.
标签: javascript ecmascript-6 es6-promise chaining