我正在使用 async.js 的 queue
,但我不确定是否应该一次处理一个任务。任务本身是发送到套接字的简单快速的消息。
process: (task, done) ->
task.client.send(task.model, done)
对比
process: (task, done) ->
task.client.send(task.model)
done()
最佳答案
正确答案是“视情况而定”。
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
的情况)是您无法控制 发送
调用。 Async.js queue
方法的默认并发级别是 1
,因此在第二种情况下,send
调用在前一个调用之前执行被终止。因此,所有 send
请求可以同时启动,您不能对其进行限制。
在第一种情况下(done
作为 send
的第二个参数)你可以更好地控制 send
请求并且可以控制级别使用 queue
第二个参数的并行性 (concurrency
)。
关于javascript - 使用异步队列时应该使用回调吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31693665/