繁体   English   中英

如何将函数转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM