【问题标题】:Composing Promises and non-promise values组合 Promise 和 non-promise 值
【发布时间】:2016-05-17 15:51:03
【问题描述】:

我有一些基本上看起来像这样的代码:

let foos = ['foo', 'foo', 'foo'];
let bars = foos.map(foo => new Promise(resolve => resolve(foo + ' processed')));
function f(foo, bar) { '...' };

如您所见,f() 需要 foobar 参数。问题是barPromise。如果f() 只需要bar,我会这样做:

Promise.all(bars).then(values => values.map(f));

但是,f() 需要由Promise 产生的bar 值及其匹配的非承诺foo,所以我不确定编写此代码的最佳方法是什么?

【问题讨论】:

  • 你的bars 承诺永远不会得到解决?
  • @Bergi:哎呀,已编辑。

标签: javascript promise ecmascript-6 es6-promise


【解决方案1】:

.map 也将元素的索引传递给回调,所以你可以这样做

Promise.all(bars).then(
   values => values.map((value, i) => f(foos[i], value))
);

【讨论】:

  • 这是个好主意,但上面的代码只是一个示例。在实际代码中,foos 不在.then() 处理程序的范围内,所以很大一部分问题是要将foo 传递到该范围内。
  • 那似乎是一个非常不同的问题。 foos 需要在任何调用 .then 的范围内。我假设如果bars 在范围内,foos 也在范围内。请提供一个更好的例子来说明您的问题。
  • @DunPeal:如果bar 不是承诺,foos 将如何在范围内?
【解决方案2】:

如果foos 不在Promise.all().then() 处理程序的范围内,那么您需要确保foosbars 沿着承诺链传递。

这里有几种方法:

1.传递对象数组

每个对象都将包含一个foo 及其对应的bar

let foos = ['foo', 'foo', 'foo'];
let promises = foos.map(foo => new Promise(resolve => resolve({
    unprocessed: foo,
    processed: foo + ' processed'
})));
// ...
Promise.all(promises).then(results => results.map(obj => f(obj.unprocessed, obj.processed)));

Demo

2。传递一个数组对象

该对象将包含一个foos 数组和一个全等bars 数组。

let foos = ['foo', 'foo', 'foo'];
let promise = Promise.all(foos.map(foo => new Promise(resolve => resolve(foo + ' processed'))))
    .then(bars => ({ 'unprocessed': foos, 'processed': bars }));
// ...
promise.then(obj => obj.unprocessed.map((foo, i) => f(foo, obj.processed[i])));

Demo

(1) 可以说比 (2) 更简洁。

【讨论】:

    【解决方案3】:

    (遵守cmets中提到的foos不在范围内的限制……)

    您可以使用 ES6 解构更顺畅地传递额外的参数:

    let foos = ['foo', 'foo', 'foo'];
    let bars = foos.map(foo => new Promise(res => res([foo, foo + ' processed'])));
    Promise.all(bars).then(values => values.map(([foo, bar]) => f(foo, bar)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2021-06-13
      • 1970-01-01
      相关资源
      最近更新 更多