组合承诺和非承诺值
Composing Promises and non-promise values
我有一些基本上看起来像这样的代码:
let foos = ['foo', 'foo', 'foo'];
let bars = foos.map(foo => new Promise(resolve => resolve(foo + ' processed')));
function f(foo, bar) { '...' };
正如您所看到的,f()
需要一个foo
和一个bar
参数。问题是bar
是Promise
。如果f()
只需要bar
,我会做:
Promise.all(bars).then(values => values.map(f));
然而,f()
需要由Promise
及其匹配的非承诺foo
产生的bar
值,所以我不确定编码这一点的最佳方式是什么?
.map
也将元素的索引传递给回调,因此可以执行
Promise.all(bars).then(
values => values.map((value, i) => f(foos[i], value))
);
如果foos
不在Promise.all().then()
处理程序的范围内,则需要确保foos
和bars
都是沿着承诺链传递的。
以下是几种方法:
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)));
演示
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])));
演示
(1) 可以说没有(2)那么混乱。
(遵守评论中提到的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)));
相关文章:
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- 从函数返回角度承诺
- 根据id将json数组组合为一个json数组
- 接受不在列表中的值-引导组合框
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 我怎样才能获得承诺的价值
- 组合两个javascript函数
- 延期承诺值未更新/解析/延期
- Telerik rad组合框多列数据绑定
- 在承诺链中处理早期回报的最佳方式
- 组合 2 个 JavaScript .scroll 函数
- 如何使用jquery组合两个数组
- 承诺在非节点式回调上使用Bluebird
- onChange不足以从Dojo组合框触发查询
- 组合承诺和非承诺值
- 如何组合承诺
- 将多个Bluebird承诺组合到一个承诺对象中
- 如何提前退出一个由承诺组成的组合
- 组合angularjs中的2个承诺