1

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

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
4

1 回答 1

1

您始终可以保留一个计数器:

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()

Promise 是异步逻辑回调的替代方案,你可以用它们做一些漂亮的事情,比如Promise.all,这正是你想要的。它接受一个对象数组,Promise当它们都被解析后,它会继续执行.then. 如果您有一个晚上,我建议您阅读一些有关它们的信息。一旦您掌握了它们的工作原理,它们就可以使事情变得更好。

于 2015-07-16T15:52:34.443 回答