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

Should I use a callback when using an async queue?

本文关键字:回调 我应该 异步 队列      更新时间:2023-09-26

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

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

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

正确答案是"it depends"

任务完成后,必须在任务函数内部调用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()

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

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

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