Javascript 承诺的功能操作(如筛选)
我同时执行几个查询,并从中创建一系列承诺。我希望生成的数组仅具有查询返回的某些属性,并且我希望过滤其他属性(但这些操作实际上可以是任何操作)。目前,我有:Javascript 承诺的功能操作(如筛选),javascript,promise,bluebird,Javascript,Promise,Bluebird,我同时执行几个查询,并从中创建一系列承诺。我希望生成的数组仅具有查询返回的某些属性,并且我希望过滤其他属性(但这些操作实际上可以是任何操作)。目前,我有: Promise.all(Ids.map(Id => query(Id) .then(result => result.Item) )).then(results => results.filter(Boolean)); 内部结果。Item仍然是并行完成的,所以我认为这是可以的,但我不喜欢这样,原因有两个: 我有一个内部
Promise.all(Ids.map(Id => query(Id)
.then(result => result.Item)
)).then(results => results.filter(Boolean));
内部结果。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[]
,我们首先生成一个可观察的
,然后通过各种熟悉的操作符来转换和过滤流,然后最后使用toArray
获得一个可观察的对象,该对象发出一个数组,该数组的类型为结果
您可以将可观察性视为对异步操作的承诺概念的概括,异步操作返回任意数量的值,而不仅仅是一个值。这是一个强大的范例,Rx库在许多语言中都非常流行。您可以阅读更多关于它的信息,或者开始使用npm软件包。1有很多错误。您也没有尝试为
循环“展平”,是吗?可能要切换到Rx@Bergi映射
/iterative/loop片段不是我想要展平的。我认为flatte是一个错误的词,但我的问题是内部承诺链(。然后,
)@ExplosionPills:内部链(在映射
回调中)就是循环体。这里没有什么可压扁的。你可以尝试async
/wait
或者蓝鸟Promise.coroutine
,如果你不想链接的话。顺便说一句,Boolean
只是JavaScript中的布尔构造函数,所以.filter(Boolean)
只是编写的一种方式。filter(item=>Boolean(item))
或者filter(item=>!!.item)
在您的示例中,如何生成可观察的
const Observable=require(“rxjs”)。Observable
?@ExplosionPills取决于您使用的是哪一种。如果您使用的是RxJS 5,那么您应该执行const Observable=require('RxJS/Rx')。Observable代码>。我认为RXJS4有点不同。最好的地方是查看github自述:。这里还有一个gitter聊天室:如果你在发射时遇到麻烦,那里会有一些非常有用的人。