javascript - Promise.all 中的链式 promise ,没有包装器 Promise

标签 javascript ecmascript-6 promise

Promise.all 是否可以在没有包装 promise 的情况下返回链的最后一个值?

如果不使用 await,它在我的上下文中不起作用

没有包装的例子:

function sum1(x){
  return new Promise(resolve => {
    setTimeout(t => resolve(x+1),3000)
  })
}
const p1 = sum1(1);

p1
.then(sum1)
.then(sum1)

Promise.all([p1])
.then(v => console.log(v[0]));

它记录了 2 而不是预期的 4。

但是如果我使用包装器它会起作用:

function sum1(x){
  return new Promise(resolve => {
    setTimeout(t => resolve(x+1),3000)
  })
}

function sum3(x){
  return sum1(x)
  .then(sum1)
  .then(sum1)
}
const p2 = sum3(1);

Promise.all([p2])
.then(v => console.log(v[0]));

但在我的上下文中,如果我需要为每个 promise 链创建和命名一个包装函数,事情就会变得复杂......

这可能吗?

最佳答案

您可以存储 p1.then(sum1).then(sum1) 返回的值,并对该值调用 Promise.all。它不仅等待第一个 promise 链的解析。这是一个例子:

function sum1(x) {
  return new Promise(resolve => {
    setTimeout(t => resolve(x + 1), 10);
  });
}

const p1 = sum1(1);
const p2 = p1.then(sum1).then(sum1);

Promise.all([p1]).then(v => console.log('P1', v[0]));
Promise.all([p2]).then(v => console.log('P2', v[0]));

关于javascript - Promise.all 中的链式 promise ,没有包装器 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54181083/

相关文章:

javascript - 如何将 .bind(this) 重构为 ES6 语法

javascript - 根据数组元素从数组中提取元素

javascript - 链式 promise 并装饰对象

javascript - 如何定位模块以像 Pinterest 一样显示?

javascript - 如何判断 Google 电子表格的 Google Apps 脚本中两个单元格是否相等

javascript - ES6 中是否有等效于 Python 风格的类属性?

javascript - 如何解决 for 循环中的所有 promise ?

javascript - js - 如何在 Promise .then() 中调用异步函数

javascript - 使用从 browserify 导出的模块

javascript - 如何在 javascript 中分解长时间运行的函数,但保持性能