javascript - 为什么这个 promise 链会立即解决?

标签 javascript promise ecmascript-6 es6-promise

有人可以向我解释为什么下面代码中产生的 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 )。我已经使用 promises 一段时间了,但我显然在这里遗漏了一些东西。

Chrome DevTools - promises code executed

最佳答案

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

d 被解析的原因是调用 .then 时使用不可调用的值(即使是数字文字 - 1,或 undefined)会导致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());

关于javascript - 为什么这个 promise 链会立即解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32067760/

相关文章:

javascript - 通过使用 Map Filter 与对象数组进行比较来返回字段

来自服务器时间戳的 JavaScript 异步时钟

javascript - 如何在警报窗口中显示 HTTP 响应?

javascript - 等待多个并发 await 操作

javascript - 阻止 JavaScript Promise 传播

javascript - 顺序异步函数

javascript - 如何使用 AngularJs 从不同域请求 json

javascript - 在 tempateURL 之后加载脚本

javascript - AngularJS 选择框在文档就绪时设置默认选择值

javascript - 两个流程调用Ajax方法,其中一个在最后需要额外处理