我有一些基本上看起来像这样的代码:
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()
同时需要bar
生成的Promise
值及其匹配的非承诺foo
,因此我不确定&#39}这是编码的最好方法吗?
答案 0 :(得分:3)
.map
也会将元素的索引传递给回调,因此您可以执行
Promise.all(bars).then(
values => values.map((value, i) => f(foos[i], value))
);
答案 1 :(得分:1)
如果Bank() : Fullname(""), StateOfOrigin(""), Age(0) {}
不在foos
处理程序的范围内,那么您需要确保Promise.all().then()
以及foos
在promise链中传递。
以下是几种方法:
<强> 1。提供一系列对象
每个对象都包含bars
及其对应的foo
。
bar
<强> 2。提供数组对象
该对象将包含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)));
数组和一致foos
数组。
bars
(1)可以说比(2)更不凌乱。
答案 2 :(得分:0)
(遵守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)));