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

时光怂恿深爱的人放手 提交于 2019-12-25 05:46:08

问题


In a Node/Express server in CoffeeScript, I have the following function :

@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. How can I send the result only when the loop is come at an end ?

Thanks for the help.


回答1:


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:

@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 ;-)




回答2:


You can also use async module

Here is great article Node.js async in practice: When to use what? which explains async in details.



来源:https://stackoverflow.com/questions/16570507/how-to-send-result-of-a-function-after-the-loop-is-finished

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!