0

我的 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

而且由于处理服务器功能可能很疯狂,并且正如我的这个问题所暗示的那样,我正在考虑为此使用async each。

所以我在这里:

@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 毫秒,而异步函数是相同的。我猜咖啡脚本的每个功能都做得很好。

更新:经过进一步测试,我发现异步功能较慢。真的很奇怪。

4

2 回答 2

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 习惯用法,其中第一个参数是错误对象(或null没有发生错误),第二个参数是结果值。这样,您可以将错误一直传播回调用链。

于 2013-05-19T15:41:33.113 回答
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
  )
于 2013-05-19T15:41:17.973 回答