如何将函数转换为async.each函数

时间:2013-05-19 15:26:56

标签: javascript node.js express coffeescript

我的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的每个功能都能很好地完成它的工作。

更新:经过进一步测试后,我发现异步时函数速度较慢。真的很奇怪。

2 个答案:

答案 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
  )
相关问题