我应该在使用异步队列时使用回调吗?

时间:2015-07-29 07:14:36

标签: javascript node.js asynchronous

我正在使用async.js'queue,我不确定是否应该一次处理一项任务。任务本身是一个发送到套接字的简单快速的消息。

process: (task, done) ->
  task.client.send(task.model, done)

VS

process: (task, done) ->
  task.client.send(task.model)
  done()

1 个答案:

答案 0 :(得分:3)

正确的答案是“它取决于”。

任务完成后,必须在任务函数内调用done回调,以通知队列结束。

task.client.send是异步操作,因此将在不久的将来完成。因此,有一个回调作为第二个参数,调用者可以使用它来知道发送操作何时完成。

如果您在发送请求结束时完成了任务,则应将done回调传递给task.client.send,如下所示:

process: (task, done) ->
    task.client.send(task.model, done)

如果,对于您而言,任务在发送操作开始时完成,您应该在task.client.send之后调用它,如下所示:

process: (task, done) ->
    task.client.send(task.model)
    done()

在这种情况下,可以在发送操作结束之前认为任务已完成。

我在第二种情况下看到的缺点(done调用后send调用的那个)是你无法控制send调用的并发性。 Async.js queue方法的默认并发级别为1,因此在第二种情况下,在前一个终止之前执行send调用。因此,所有send个请求都可以同时启动,您无法限制它们。

在第一种情况下(done作为send的第二个参数),您可以更好地控制send请求,并可以使用queue控制并行度第二个论点(concurrency)。