简体   繁体   English

循环结束后如何发送函数的结果?

[英]How to send result of a function after the loop is finished?

In a Node/Express server in CoffeeScript, I have the following function : 在CoffeeScript的Node / Express服务器中,我有以下功能:

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

The treatServer method take some times, and the answer is send before the loop is finish. treatServer方法需要一些时间,并且在循环结束之前发送答案。 How can I send the result only when the loop is come at an end ? 如何在循环结束时才发送结果?

Thanks for the help. 谢谢您的帮助。

It is easy as long as you know the number of servers beforehand: 只要您事先知道服务器的数量,这很容易:

@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

Edit: After thinking about it again. 编辑:再次考虑之后。 In your case this could be solved even easier: 在您的情况下,这可以更容易解决:

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

Edit 2: As squint pointed out, that push returns the length of the array: 编辑2: 斜视指出,该推送返回数组的长度:

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

If you want to maintain readability of the code, the last edit might not be the best choice ;-) 如果你想保持代码的可读性,最后的编辑可能不是最好的选择;-)

You can also use async module 您也可以使用异步模块

Here is great article Node.js async in practice: When to use what? 这是伟大的文章Node.js在实践中的异步:何时使用什么? which explains async in details. 这解释了async的细节。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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