使用Promise.race

时间:2017-09-02 13:31:26

标签: javascript promise

我试图将我的大脑包裹在作业队列中并解决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执行我不明白的订单?

有人可以为我澄清这个概念吗?

2 个答案:

答案 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.
});