我在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
在微任务队列的末尾执行,因此您可能会获得以下输出:
Before setting microTask. After setting microTask. Success 2:{"value":"foo","rand":0.3675094508130746} From microTask! Failure 1:{"value":"bar","rand":0.6828171208953322} This Timeout was set before the microTask!
但是,不应该在执行queuemicrotask
中的代码之前调用它吗?而且我看不到fooBarFailure2
有任何此类问题。它按预期顺序执行。结果与Firefox 71和Google Chrome 78相同。有人可以解释这里发生了什么吗?