承诺上的功能操作(例如过滤)

时间:2016-07-07 22:34:14

标签: javascript promise bluebird

我正在同时执行多个查询并从中创建一组promise。我希望结果数组只有从查询返回的某些属性,我想过滤其他属性(但这些操作可能真的是任何东西)。目前,我有:

Promise.all(Ids.map(Id => query(Id)
  .then(result => result.Item)
)).then(results => results.filter(Boolean));

内部result.Item仍然是并行完成的,所以我认为这没关系,但我不喜欢这个有两个原因:

  1. 我有一个内部/嵌套的承诺链我想要展平
  2. 外部过滤必须等待所有承诺完成(预期),然后迭代整个结果(坏)。最好不要在第一时间添加空白项目。
  3. 是否有一种首选方法可以对一组承诺执行功能操作?

1 个答案:

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

假设Idsnumber[],我们首先生成一个Observable<number>,然后将其传递给各种熟悉的运算符来转换和过滤流,然后最后使用{{1}获取一个observable,它发出一个任何类型toArray应该是的单个数组。

您可以将Observable视为对异步操作的promises概念的概括,该异步操作返回任意数量的值,而不仅仅是一个。这是一个强大的范例,Rx库在很多语言中都很流行。您可以阅读更多相关信息here或开始使用this npm包。