【问题标题】:How to send result of a function after the loop is finished?循环结束后如何发送函数的结果?
【发布时间】:2013-05-10 08:19:54
【问题描述】:

在 CoffeeScript 的 Node/Express 服务器中,我有以下功能:

@resolveServers = (url, servers, answer) ->
  result = []
  treatServer(url, server, (treatAnswer) ->
    result.push(treatAnswer)
  ) for server in servers
  answer(result)

treatServer 方法需要一些时间,并且在循环完成之前发送答案。只有在循环结束时才能发送结果?

感谢您的帮助。

【问题讨论】:

  • 一个简单的解决方案是维护一个本地计数器。 var count = servers.length,然后在回调内部,if (--count === 0) answer(result);
  • 你检查过节点的任何异步库吗? github.com/caolan/async 可能会有所帮助。
  • Squint:您的提示有效,但我更喜欢 TheHippo 的回答方式。 Aaron:Node 提供原生异步。不过谢谢。
  • 你的意思是增加而不是减少?当然,这也行。 @AaronDufour 谈论的库是用于管理 异步活动。除非我错过了,否则 NodeJS 不会提供类似的东西。
  • @brnrd 斜视是对的。它用于管理异步任务 - 以串行、并行、forEach 等方式运行它们,并在一切完成后自动调用最终回调。

标签: javascript node.js express coffeescript


【解决方案1】:

只要事先知道服务器数量就很简单:

@resolveServers = (url, servers, answer) ->
    result = []
    count = 0
    treatServer(url, server, (treatAnswer) ->
        result.push(treatAnswer)
        count++
        answer result if count is servers.length
    ) for server in servers

编辑:再想一想。在您的情况下,这可以更容易地解决:

@resolveServers = (url, servers, answer) ->
    result = []
    treatServer(url, server, (treatAnswer) ->
        result.push treatAnswer
        answer result if result.length is servers.length
    ) for server in servers

编辑 2: 正如squint 指出的那样, push 返回数组的长度:

@resolveServers = (url, servers, answer) ->
    result = []
    treatServer(url, server, (treatAnswer) ->
        answer result if result.push(treatAnswer) is servers.length
    ) for server in servers

如果您想保持代码的可读性,最后一次编辑可能不是最佳选择;-)

【讨论】:

  • 非常感谢。没有想过这个。不会忘记诀窍。
  • @brnrd 还有更短的方法
  • +1 你甚至可以把它压得更紧一点,因为.push() 会返回新的.length
  • 不过,这并不能保证结果的顺序与servers 列表的顺序相同。
  • @TheHippo 同意了,只是要实现一些事情 :)
【解决方案2】:

你也可以使用async模块

这是一篇很棒的文章 Node.js async in practice: When to use what?,它详细解释了异步。

【讨论】:

    猜你喜欢
    • 2023-01-09
    • 2018-07-27
    • 2015-08-08
    • 2021-06-05
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多