撰写承诺和非承诺价值观

时间:2016-05-17 15:51:03

标签: javascript promise ecmascript-6 es6-promise

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

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()同时需要bar生成的Promise值及其匹配的非承诺foo,因此我不确定&#39}这是编码的最好方法吗?

3 个答案:

答案 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

Demo

<强> 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

Demo

(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)));