对承诺的功能操作(例如筛选)

Functional operations (such as filtering) on promises

本文关键字:筛选 操作 承诺 功能      更新时间:2023-09-26

我同时执行多个查询并从中创建一系列承诺。我希望生成的数组仅具有从查询返回的某些属性,并且我想过滤其他属性(但这些操作实际上可以是任何东西)。目前,我有:

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

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

  1. 我有一个内部/嵌套的承诺链,我想扁平化
  2. 外部过滤必须等待所有承诺完成(预期),然后迭代整个结果(坏)。最好不要首先添加空项目。

是否有对承诺集合执行功能操作的首选方法?

一种方法是使用反应式扩展库,它提供了一种将不同的异步性模型集成到概念"流"模型中的方法。 例如,您那里的代码(假设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>,然后通过各种熟悉的运算符对其进行转换和过滤流,最后使用toArray得到一个可观察量,该可观察量发出result.Item应该是什么类型的单个数组。

您可以将 Observables 视为承诺概念对异步操作的概括,异步操作返回任意数量的值,而不仅仅是一个值。这是一个强大的范例,Rx 库在许多语言中都非常流行。你可以在这里阅读更多关于它的信息,或者开始使用这个 npm 包。