Javascript 使用Promise.race从作业队列执行和解析承诺的顺序

Javascript 使用Promise.race从作业队列执行和解析承诺的顺序,javascript,promise,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)

我正试着用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被拒绝之后。

我知道这一承诺。只要提供的第一个承诺得到解决,race()就会得到解决。 但为什么书中声称承诺p1在p2之后解决?如果代码从上到下,p1首先出现,所以我认为它应该先解决。是因为包装的功能吗?还是我不明白的javascript执行命令


有人能给我澄清一下这个概念吗

因此,这本书似乎是错的。实际上,
p1
是在构建
p2
之前完成的,当执行示例时,您得到的结果是“42”,而不是拒绝“43”

作者可能对
newpromise
回调感到困惑,实际上,这与所有其他Promise回调(通过
then
)不同。也许这个例子是故意的

let p1 = Promise.resolve().then(() => 42);
//                              ^^^^^^^^ asynchronous
let p2 = Promise.reject(43);
let p3 = Promise.resolve(44);

let p4 = Promise.race([
  p1, // still pending
  p2, // already rejected
  p3  // already fulfilled
]); // so p4 will get rejected, as its callback on p2 is the first to be invoked in order
p4.then(console.log, console.error);

我同意伯吉的回答。如果您需要访问构造函数范围之外的resolve/reject函数,将同步调用承诺构造函数回调。根据您的代码片段,它确实是同步调用的但是如果解析/拒绝函数是通过ajax请求执行的,或者是包装到setTimeout函数,那么这个过程将是异步的

const p1 = new Promise((resolve, reject) => {
   setTimeout(() => resolve(42), 100); // this will result in asynchronous process.
});

看一看我明白这本书的意思,但问题是JavaScript Promise实现(至少Firefox和Node)实际上并不是这样的。