我的 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 函数。
知道我做错了什么吗?
已经谢谢了。
更新:我有点失望,因为使用异步我没有任何收获。我使用的函数大约需要 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
表示没有发生错误),第二个参数是结果值。这样,您就可以将错误一路传播回调用链。
关于javascript - 如何将函数转换为 async.each 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16636279/