我应该在使用asynchronous队列时使用callback吗?

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

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

VS

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

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

当任务完成时, donecallback必须在任务函数内被调用以通知队列的结论。

task.client.send是一个asynchronous操作,所以它将在不久的将来完成。 由于这个原因,有一个callback作为第二个参数,可以被调用者用来知道发送操作何时完成。

如果你的任务在发送请求结束时完成,你应该把donecallback传递给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请求可以同时开始,你不能限制它们。

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