Javascript 使用Promise.race从作业队列执行和解析承诺的顺序
我正试着用Javascript来处理工作队列和承诺。我使用了Nicholas Zakas的《理解ECMAScript 6》一书,其中有一段关于Promice.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)
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)实际上并不是这样的。