我试图将我的大脑包裹在作业队列中并解决Javascript中的承诺。我使用了Nicholas Zakas的书"了解ECMAScript 6",并且有关于Promice.race()的代码片段和描述,我加粗了,我不明白:
let p1 = new Promise(function(resolve, reject) {
resolve(42);
});
let p2 = Promise.reject(43);
let p3 = new Promise(function(resolve, reject) {
resolve(44);
});
let p4 = Promise.race([p1, p2, p3]);
p4.catch(function(value) {
console.log(value); // 43
});
这里,p4被拒绝,因为当调用Promise.race()时,p2已经处于被拒绝状态。 即使履行了p1和p3,也会忽略这些结果,因为它们会在p2被拒绝后发生。
我知道Promise.race()会在所有提供的承诺得到解决后立即解决。 但为什么这本书声称承诺p1在p2之后结算?如果代码从顶部到底部,p1首先出现,所以我认为它应该首先解决。是因为功能包装?或javascript执行我不明白的订单?
有人可以为我澄清这个概念吗?
答案 0 :(得分:2)
该帐户上的图书似乎有误。实际上,$( window ).ready(function() {
var height = document.getElementById("head").offsetHeight;
var x = document.getElementsByClassName("dropdown-menu");
var i;
for (i = 0; i < x.length; i++) {
x[i].style.top = height + 'px';
}
});
$( window ).click(function() {
setTimeout(function() {
var height = document.getElementById("head").offsetHeight;
var x = document.getElementsByClassName("dropdown-menu");
var i;
for (i = 0; i < x.length; i++) {
x[i].style.top = height + 'px';
}
}, 500);
});
$( window ).resize(function() {
var height = document.getElementById("head").offsetHeight;
var x = document.getElementsByClassName("dropdown-menu");
var i;
for (i = 0; i < x.length; i++) {
x[i].style.top = height + 'px';
}
});
在构造p1
之前就已经完成,并且在执行示例时,您得到结果“42”而不是拒绝“43”。
作者可能对p2
回调实际上is invoked synchronously感到困惑,与所有其他承诺回调(通过new Promise
)不同。也许这个例子意味着
then
答案 1 :(得分:0)
我同意 Bergi的回答。如果需要访问构造函数范围之外的resolve / reject函数,则会同步调用promise构造函数回调。根据你的代码片段,它确实同步调用。 但是如果通过ajax请求执行resolve / reject函数,或者将其换行到setTimeout函数,则该进程将是异步的。
const p1 = new Promise((resolve, reject) => {
setTimeout(() => resolve(42), 100); // this will result in asynchronous process.
});