为什么这一系列承诺会立即解决?

时间:2015-08-18 08:50:35

标签: javascript promise ecmascript-6 es6-promise

有人可以向我解释为什么立即解决下面代码中产生的承诺(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());

我正在创建一个永远未决的Promise数组,因此生成的promise也应该永远等待,因为它等待所有后续的promise完成(as presented here)。我现在已经使用了一段时间的承诺,但我在这里明显遗漏了一些东西。

Chrome DevTools - promises code executed

2 个答案:

答案 0 :(得分:10)

then没有Promise作为输入,它需要2个函数,1个用于履行,1个用于拒绝。

解决d的原因是因为调用带有不可调用值的.then(甚至数字文字-1或undefined)会导致onFulfilled函数被替换为"身份",它只是重新满足上一步中解决的任何值。见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());

因为你正在使用承诺& 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());

答案 1 :(得分:-1)

var d = [a, b, c].reduce(function (previousPromise, promise) {
    return previousPromise.then(promise);
}, Promise.resolve());

你的初始d promise状态已经解决,你设置为Promise.resolve()。检查reduce https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

的文档
相关问题