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.
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 ;-)
You can also use async module
Here is great article Node.js async in practice: When to use what? which explains async in details.