【问题标题】:How to convert a function to an async.each function如何将函数转换为 async.each 函数
【发布时间】:2013-05-14 05:30:31
【问题描述】:

我的 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 函数。

知道我做错了什么吗?

已经谢谢了。

更新:我有点失望,因为我使用 async 完全没有收获。我使用的函数大约需要 6500 毫秒,而异步函数是相同的。我猜咖啡脚本的每个函数都做得很好。

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

【问题讨论】:

    标签: javascript node.js express coffeescript


    【解决方案1】:

    我认为您需要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 没有发生错误),第二个参数是结果值。这样,您可以将错误一直传播到调用链。

    【讨论】:

      【解决方案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
        )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-07
        • 1970-01-01
        • 2016-01-01
        • 1970-01-01
        • 2020-03-07
        • 2017-04-04
        • 2018-12-04
        • 2020-09-03
        相关资源
        最近更新 更多