我正在同时执行多个查询并从中创建一组promise。我希望结果数组只有从查询返回的某些属性,我想过滤其他属性(但这些操作可能真的是任何东西)。目前,我有:
Promise.all(Ids.map(Id => query(Id)
.then(result => result.Item)
)).then(results => results.filter(Boolean));
内部result.Item
仍然是并行完成的,所以我认为这没关系,但我不喜欢这个有两个原因:
是否有一种首选方法可以对一组承诺执行功能操作?
答案 0 :(得分:1)
一种方法是使用Reactive Extensions库,它提供了一种将异步性的不同模型集成到概念“流”模型中的方法。例如。你在那里的代码(假设Ids
是一个数组而query
返回一个承诺)将变为:
Observable.from(Ids)
.flatMap(id => query(id))
.map(result => result.Item)
.filter(item => item.filterByThis) // Not sure what Boolean is supposed to be in your code
.toArray();
假设Ids
是number[]
,我们首先生成一个Observable<number>
,然后将其传递给各种熟悉的运算符来转换和过滤流,然后最后使用{{1}获取一个observable,它发出一个任何类型toArray
应该是的单个数组。
您可以将Observable视为对异步操作的promises概念的概括,该异步操作返回任意数量的值,而不仅仅是一个。这是一个强大的范例,Rx库在很多语言中都很流行。您可以阅读更多相关信息here或开始使用this npm包。