从嵌套的asynchronous函数调用中返回谓词

我需要过滤一个数组,取决于从外部API中获取数据所获得的每个元素的子元素是否与条件匹配。

代码可能比解释更清晰:

//Suppose there is an array filled //_.filter(array, predicate) var filtered_array = _.filter(array,function(element){ //Async operation webservices.doStuff(element, function(sub_element){ //This return is meant for the filter, but returns on .doStuff callback return sub_element.thing === "ok"; }); }); 

这里的问题是我不知道如何返回谓词的结果,因为webservices.doStuff是asynchronous的!

任何想法?

我会使用Q或asynchronous来做到这一点。 考虑以下示例,将每个Web服务调用包装在一个承诺中,并定义在解决所有承诺时将解决的另一个承诺。 然后根据你的逻辑过滤结果(即来自所有调用的所有返回数组)。

  var source = [{a : 1}, {a:2}...] // your data var all = Q.all(source.map((o) => Q.Promise((resolve, reject,notify) => webService.doStuff(o, resolve, reject)))) all.then((ret) => _.filter(ret.data, (elem) => elem.thing === "ok")) .then((filtered) => ... // do something with filtered ) 

很可能您的Web服务代理已经与Q或其他承诺库绑定。 所以你的代码会更简单一些,比如:

 var all = Q.all(source.map(webService.doStuff)) .then(filter).then(process) 

或者至less你可以重构它是如此简单。

总的来说,由于node.js环境的非阻塞 – 接受 – callback和自然的性质,掌握一个promise库是非常重要的,就我所知, asyncQ是最受欢迎的。

更新 :现在好像是蓝鸟,也是最快的。)

在处理asynchronous调用时,让他们中的任何一个都可以让您更容易devise。

您应该查看一下async.js库https://github.com/caolan/async ,它可以处理大量asynchronous请求,并在完成所有请求时发出一个callback,并为您提供一个全部列表结果,然后你可以应用你的过滤function。 我不记得你可以立即提供一个谓词函数来描述哪些结果应该在最终的结果集中,但是如果库不支持它,它应该能够做这样的事情,而不需要太多的工作。

看看async.js文档中的filter函数。