![](/img/trans.png)
[英]JavaScript Promises: chaining promises with non-promise objects. Why it works?
[英]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
產生的bar
值,也需要匹配其匹配的non-promise foo
,所以我不確定什么是編寫此代碼的最佳方法?
.map
將元素的索引傳遞給回調,因此您可以執行
Promise.all(bars).then(
values => values.map((value, i) => f(foos[i], value))
);
如果foos
不在Promise.all().then()
處理程序的范圍內,那么您需要確保foos
和bars
都在promise鏈中傳遞。
這有兩種方法:
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)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.