简体   繁体   English

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

[英]Why this chain of promises immediately resolves?

Can someone explain to me why the resulting promise ( d ) from the code below is resolved immediately? 有人可以向我解释为什么立即解决下面代码中的结果承诺( 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());

I'm creating an array of promises that are pending forever, so the resulting promise should also be pending forever as it waits for all subsequent promises to finish ( as presented here ). 我创建永远未决承诺的阵列,因此所得到的承诺应等待所有后续承诺到结束也永远挂起( 这里所提出 )。 I've been using promises for a while now, but I'm clearly missing something here. 我已经使用了一段时间的承诺,但我在这里显然遗漏了一些东西。

Chrome DevTools  - 承诺执行代码

then doesn't take a Promise as an input, it takes 2 functions, 1 for fulfillment and 1 for rejection. then不接受Promise作为输入,它需要2个函数,1个用于履行,1个用于拒绝。

The reason d is resolved is due to the fact that calling .then with a non-callable value (even a number literal - 1, or undefined ) causes the onFulfilled function to be replace by "Identity", which simply re-fulfills with whatever value was resolved in the previous step. 解决d的原因是由于调用.then具有不可调用的值(甚至数字文字-1或undefined )会导致onFulfilled函数被“Identity”替换,而“Identity”只是重新实现了值已在上一步中解决。 See PerformPromiseThen 请参阅PerformPromiseThen

Try like this: 试试这样:

//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());

Or alternatively... 或者......

//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());

And since you're using promises & ES6, you could be more concise: 既然你正在使用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());

Your initial state of d promise is resolved, you set is as Promise.resolve(). 您的初始d promise状态已解决,您设置为Promise.resolve()。 Check documentation of reduce https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce 检查reduce的文档https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM