node.js:等待所有线程完成

node.js: wait until all threads are done

我正在用 coffeescript 编写 hubot 脚本。该脚本打开三个线程,它们都执行 YQL 查询。如果每个线程将他的消息发送到聊天客户端(在我的例子中是 Slack),client dies。现在我需要以某种方式从所有线程中收集字符串并将它们组合到一个发送命令中,我该如何最好地做到这一点?

slack_message = '*Todays menu*'
for i in [1..3]
  query = "select * from html where url='XPATH.. ["+i+"] XPATH.."
  new YQL.exec query, (response) ->
    m = response.query.results;
    slack_message += m

msg.send slack_message

您可以随时保留计数器:

slack_message = '*Todays menu*'
queries_done = 0

for i in [1..3]
  query = "select * from html where url='XPATH.. ["+i+"] XPATH.."
  new YQL.exec query, (response) ->
    m = response.query.results
    slack_message += m

    if queries_done is 3
      msg.send slack_message

您也可以使用 Promises:

Promise = require("promise")

call_query = (query) ->
  new Promise (resolve) ->
    new YQL.exec query, (response) ->
      resolve response.query.results;

get_menu = ->
  slack_message = '*Todays menu*'
  queries = []
  for i in [1..3]
    queries.push (call_query "select * from html where url='XPATH.. ["+i+"] XPATH..")

  Promise.all(queries).then (messages) ->
    msg.send slack_message + messages.join()

Promises 是异步逻辑回调的替代方法,您可以用它们做一些漂亮的事情,例如 Promise.all,这正是您正在寻找的。它接收一个 Promise 对象数组,当它们全部解析后,它继续执行 .then。如果你有一个晚上,我建议阅读一些关于它们的内容。一旦您掌握了它们的工作原理,它们就能让事情变得更好。