promise的解析顺序和Promise.settle中提到的顺序一样吗?
Is the resolution order of promises same as the order in which it is mentioned in Promise.settle?
在我 return 回复客户之前,我有 2 个承诺需要解决。
我正在使用蓝鸟。
Promise
.settle([prmoise1(), promise2()])
.then(function(results){
results.forEach(function(result){
if(result.isFulfilled()){
console.log(result);
}
});
});
promise 的解析顺序是什么?
在这种情况下,promise1() 总是首先解决吗?
如果不是,我们如何访问与 promise() 关联的结果?
不,就像在 .all()
中一样,所有操作都会同时调用*并且承诺会在任何时候解决。
然而,results
数组将始终按照原始数组的顺序排列,因此 results[0]
将是 promise1()
的结果。
* 他们一个接一个被调用,但我们不等第一个完成才开始第二个
在你的代码中,你的两个 promise 生成的函数被一个接一个地调用,它们将按照它们的自然时间导致它们完成的任何顺序完成。如果 promise2()
是一个非常快的异步操作,它可以在 promise1()
之前非常好地完成,因此将在另一个之前解决它的承诺。或者,反之亦然。换句话说,没有保证,因为它完全取决于每个异步操作的时间。当 运行 以这种方式进行异步操作时,您是 运行 它们并行(同时在飞行中)。
Promise.settle()
生成的结果数组将始终按最初指定的顺序排列,就像 Promise.all()
一样,因此 Promise.settle(...).then(function(results) {})
结果数组中的第一项将始终属于 promise1()
和第二个 promise2()
.
注意:Promise.settle()
似乎已从最新版本的 Bluebird 中删除。您可以在每个生成的承诺上使用 .reflect()
来模拟此行为,如 here 所述。事实上,在最新版本的 Bluebird 中,您可以这样做:
Promise.all([promise1().reflect(), promise2().reflect()]).then(function(results){
results.forEach(function(result){
if(result.isFulfilled()){
console.log(result);
}
});
});
在最新的 Bluebird 中,您可以制作自己的 Promise.settle()
与一系列承诺一起使用:
Promise.settle = function(array) {
var reflects = [];
if (array) {
reflects = array.map(function(item) {
// if it's a promise with .reflect(), call `.reflect()`
if (typeof item.then === "function" && typeof item.reflect === "function") {
return item.reflect();
} else {
// cast into a promise and call .reflect()
return Promise.resolve(item).reflect();
}
});
}
return Promise.all(reflects);
}
在我 return 回复客户之前,我有 2 个承诺需要解决。
我正在使用蓝鸟。
Promise
.settle([prmoise1(), promise2()])
.then(function(results){
results.forEach(function(result){
if(result.isFulfilled()){
console.log(result);
}
});
});
promise 的解析顺序是什么?
在这种情况下,promise1() 总是首先解决吗?
如果不是,我们如何访问与 promise() 关联的结果?
不,就像在 .all()
中一样,所有操作都会同时调用*并且承诺会在任何时候解决。
然而,results
数组将始终按照原始数组的顺序排列,因此 results[0]
将是 promise1()
的结果。
* 他们一个接一个被调用,但我们不等第一个完成才开始第二个
在你的代码中,你的两个 promise 生成的函数被一个接一个地调用,它们将按照它们的自然时间导致它们完成的任何顺序完成。如果 promise2()
是一个非常快的异步操作,它可以在 promise1()
之前非常好地完成,因此将在另一个之前解决它的承诺。或者,反之亦然。换句话说,没有保证,因为它完全取决于每个异步操作的时间。当 运行 以这种方式进行异步操作时,您是 运行 它们并行(同时在飞行中)。
Promise.settle()
生成的结果数组将始终按最初指定的顺序排列,就像 Promise.all()
一样,因此 Promise.settle(...).then(function(results) {})
结果数组中的第一项将始终属于 promise1()
和第二个 promise2()
.
注意:Promise.settle()
似乎已从最新版本的 Bluebird 中删除。您可以在每个生成的承诺上使用 .reflect()
来模拟此行为,如 here 所述。事实上,在最新版本的 Bluebird 中,您可以这样做:
Promise.all([promise1().reflect(), promise2().reflect()]).then(function(results){
results.forEach(function(result){
if(result.isFulfilled()){
console.log(result);
}
});
});
在最新的 Bluebird 中,您可以制作自己的 Promise.settle()
与一系列承诺一起使用:
Promise.settle = function(array) {
var reflects = [];
if (array) {
reflects = array.map(function(item) {
// if it's a promise with .reflect(), call `.reflect()`
if (typeof item.then === "function" && typeof item.reflect === "function") {
return item.reflect();
} else {
// cast into a promise and call .reflect()
return Promise.resolve(item).reflect();
}
});
}
return Promise.all(reflects);
}