![](/img/trans.png)
[英]How to call async.each in an external function having async.waterfall inside async.each
[英]How to convert a function to an async.each function
我的nodejs / express服务器类中的函数存在一个小问题。
我有以下功能:
@resolveServers = (url, servers, resolved) ->
result = []
treatServer(url, server, (serverObject) ->
result.push serverObject
resolved result if result.length is servers.length
) for server in servers
而且由于请客服务器功能可能会变得很疯狂,并且正如我的这个问题所暗示的那样,我正在考虑为此使用异步 。
所以我在这里:
@resolveServers = (url, servers, resolved) ->
result = []
async.each(servers, treatServer(url, server, (serverObject) ->
result.push serverObject
resolved result if result.length is servers.length
), (err) ->
if err
console.log next err
)
我目前收到以下错误:
ReferenceError: server is not defined
TreatServer函数需要url和服务器阵列的服务器。 但是我不知道如何为每个服务器实例获取此服务器实例,并将其传递给treatServer函数。
有什么想法我做错了吗?
谢谢了
更新:我有点失望,因为使用异步根本没有收获。 我使用的功能大约需要6500毫秒,而异步功能是相同的。 我想coffeescript的每个功能都做得很好。
更新:经过进一步的测试,我发现异步功能较慢。 真的很奇怪。
我认为您想要async.map
代替:它收集所有操作的结果,并将它们作为数组传递给最终的回调。 它还维护输入数组的顺序,而async.each
则不会(但是这可能不是问题)。
@resolveServers = (url, servers, resolved) ->
async.map(servers, (server, callback) ->
treatServer(url, server, (serverObject) ->
callback null, serverObject
)
, (err, result) ->
if err
console.log next err
resolved err, result // see text
)
由于我的CF不太好,因此也使用JS版本:
function resolveServers(url, servers, resolved) {
async.map(servers, function(server, callback) {
treatServer(url, server, function(serverObject) {
callback(null, serverObject);
});
}, function(err, result) {
if (err)
console.log(err);
resolved(err, result);
});
}
我还建议遵循异步回调的通用Node习惯用法,其中第一个参数是错误对象(或null
表示没有发生错误),第二个参数是结果值。 这样,您可以将错误一直传播到调用链。
async.each的迭代器函数采用两个这样的参数:
async.each(openFiles,
function(file, callback) {
// do something with file
callback()
}, function(err){
// if any of the saves produced an error, err would equal that error
});
在您的情况下,您将获得一个服务器和一个回调,因此我将重写为以下内容:
@resolveServers = (url, servers, resolved) ->
result = []
async.each(servers, (server, callback) ->
treatServer(url, server, (serverObject) ->
result.push serverObject
resolved result if result.length is servers.length
callback()
)
, (err) ->
if err
console.log next err
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.