为什么这个承诺链会立即解决?
Why this chain of promises immediately resolves?
有人可以向我解释为什么下面代码的结果承诺 (d
) 会立即得到解决吗?
//promises that are never resolved nor rejected
var a = new Promise(function(r,re){});
var b = new Promise(function(r,re){});
var c = new Promise(function(r,re){});
var d = [a, b, c].reduce(function (previousPromise, promise) {
return previousPromise.then(promise);
}, Promise.resolve());
我正在创建一个永远悬而未决的承诺数组,因此生成的承诺也应该永远悬而未决,因为它会等待所有后续承诺完成 (as presented here)。我已经使用 promises 一段时间了,但我显然在这里遗漏了一些东西。
then
不接受 Promise
作为输入,它接受 2 个函数,1 个用于实现,1 个用于拒绝。
解决 d
的原因是,使用不可调用的值(即使是数字文字 - 1,或 undefined
)调用 .then 会导致 onFulfilled 函数替换为 "Identity",它只是用上一步中解析的任何值重新实现。参见 PerformPromiseThen
这样试试:
//promises that are never resolved nor rejected
var a = function() { return new Promise(function(r,re){}); };
var b = function() { return new Promise(function(r,re){}); };
var c = function() { return new Promise(function(r,re){}); };
// or simply, a = b = c after setting the function for c
var d = [a, b, c].reduce(function (previousPromise, fn) {
return previousPromise.then(fn, /* not passing a rejection handler... */);
}, Promise.resolve());
或者……
//promises that are never resolved nor rejected
var a = new Promise(function(r,re){});
var b = new Promise(function(r,re){});
var c = new Promise(function(r,re){});
var d = [a, b, c].reduce(function (previousPromise, promise) {
return previousPromise.then(function() {return promise;});
}, Promise.resolve());
而且由于您使用的是 promises 和 ES6,因此您可以更简洁:
let a = new Promise(() => {});
let b = new Promise(() => {});
let c = new Promise(() => {});
let d = [a, b, c].reduce((previousPromise, promise) =>
previousPromise.then(() => promise),
Promise.resolve());
var d = [a, b, c].reduce(function (previousPromise, promise) {
return previousPromise.then(promise);
}, Promise.resolve());
你的d promise的初始状态是resolved,你设置的是Promise.resolve()。检查 reduce https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
的文档
有人可以向我解释为什么下面代码的结果承诺 (d
) 会立即得到解决吗?
//promises that are never resolved nor rejected
var a = new Promise(function(r,re){});
var b = new Promise(function(r,re){});
var c = new Promise(function(r,re){});
var d = [a, b, c].reduce(function (previousPromise, promise) {
return previousPromise.then(promise);
}, Promise.resolve());
我正在创建一个永远悬而未决的承诺数组,因此生成的承诺也应该永远悬而未决,因为它会等待所有后续承诺完成 (as presented here)。我已经使用 promises 一段时间了,但我显然在这里遗漏了一些东西。
then
不接受 Promise
作为输入,它接受 2 个函数,1 个用于实现,1 个用于拒绝。
解决 d
的原因是,使用不可调用的值(即使是数字文字 - 1,或 undefined
)调用 .then 会导致 onFulfilled 函数替换为 "Identity",它只是用上一步中解析的任何值重新实现。参见 PerformPromiseThen
这样试试:
//promises that are never resolved nor rejected
var a = function() { return new Promise(function(r,re){}); };
var b = function() { return new Promise(function(r,re){}); };
var c = function() { return new Promise(function(r,re){}); };
// or simply, a = b = c after setting the function for c
var d = [a, b, c].reduce(function (previousPromise, fn) {
return previousPromise.then(fn, /* not passing a rejection handler... */);
}, Promise.resolve());
或者……
//promises that are never resolved nor rejected
var a = new Promise(function(r,re){});
var b = new Promise(function(r,re){});
var c = new Promise(function(r,re){});
var d = [a, b, c].reduce(function (previousPromise, promise) {
return previousPromise.then(function() {return promise;});
}, Promise.resolve());
而且由于您使用的是 promises 和 ES6,因此您可以更简洁:
let a = new Promise(() => {});
let b = new Promise(() => {});
let c = new Promise(() => {});
let d = [a, b, c].reduce((previousPromise, promise) =>
previousPromise.then(() => promise),
Promise.resolve());
var d = [a, b, c].reduce(function (previousPromise, promise) {
return previousPromise.then(promise);
}, Promise.resolve());
你的d promise的初始状态是resolved,你设置的是Promise.resolve()。检查 reduce https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
的文档