簡體   English   中英

構成承諾和非承諾價值

[英]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()處理程序的范圍內,那么您需要確保foosbars都在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM