我的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
由于处理服务器功能可能非常繁琐,并且正如我的question暗示的那样,我正考虑为此使用async。
所以我在这里:
@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函数。
对我做错了什么的想法?
谢谢。
更新:我有点失望,因为我根本没有获得使用异步的好处。我使用的函数大约需要6500ms,异步函数是相同的。我想coffeescript的每个功能都能很好地完成它的工作。
更新:经过进一步测试后,我发现异步时函数速度较慢。真的很奇怪。
答案 0 :(得分:4)
我认为你想要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 idiom,其中第一个参数是错误对象(或null
没有发生错误),第二个参数是结果值。这样,您就可以将错误传播回调用链。
答案 1 :(得分:2)
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
)