为什么这个承诺链会立即解决?

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

的文档