我应该在使用asynchronous队列时使用callback吗?
我正在使用async.js的queue
,我不确定是否应该一次处理一个任务。 任务本身是一个简单而快速的消息发送到套接字。
process: (task, done) -> task.client.send(task.model, done)
VS
process: (task, done) -> task.client.send(task.model) done()
正确的答案是“这取决于”。
当任务完成时, done
callback必须在任务函数内被调用以通知队列的结论。
task.client.send
是一个asynchronous操作,所以它将在不久的将来完成。 由于这个原因,有一个callback作为第二个参数,可以被调用者用来知道发送操作何时完成。
如果你的任务在发送请求结束时完成,你应该把done
callback传递给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
)控制并行级别。