对承诺的功能操作(例如筛选)
Functional operations (such as filtering) on promises
我同时执行多个查询并从中创建一系列承诺。我希望生成的数组仅具有从查询返回的某些属性,并且我想过滤其他属性(但这些操作实际上可以是任何东西)。目前,我有:
Promise.all(Ids.map(Id => query(Id)
.then(result => result.Item)
)).then(results => results.filter(Boolean));
内部result.Item
仍然是并行完成的,所以我认为这没关系,但我不喜欢这样,原因有两个:
- 我有一个内部/嵌套的承诺链,我想扁平化
- 外部过滤必须等待所有承诺完成(预期),然后迭代整个结果(坏)。最好不要首先添加空项目。
是否有对承诺集合执行功能操作的首选方法?
一种方法是使用反应式扩展库,它提供了一种将不同的异步性模型集成到概念"流"模型中的方法。 例如,您那里的代码(假设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 包。
相关文章:
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- 如何确定javascript已经完成了某些操作.ios上的
- 防止Alt+Shift默认操作或检测多种操作系统语言的Javascript
- 从JavaScript访问struts操作中的属性
- 使用AngularJS中的筛选器更新给定的表
- 淘汰搜索/筛选
- fluxxor向一个flux实例添加一组以上的操作
- Jquery表单验证插件-如果选中复选框,如何在提交时执行某些操作
- AngularJS单选筛选不适用于Name、Description和Field4复选框值
- 操作放置在画布上的元素之间的连接
- 使用“+="操作人员
- Rails操作只调用一次,但我在ajax中每秒钟都调用一次
- Jquery未定义函数正在停止其他操作
- 如何操作iframe之外的元素
- Angular JS Filter-通过3个复选框进行筛选
- 筛选器操作后,工具提示停止工作
- 使用字符串或DOM操作筛选AJAX响应
- 使用forEach、映射或筛选器克隆和操作嵌套对象,而不修改原始对象
- 对承诺的功能操作(例如筛选)