我应该在使用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
)控制并行级别。
- node.js模块:Async vs Fibers.promise vs Q_oper8
- 将对象从asynchronouscallback函数中推入到本地数组中
- asynchronous(同步)函数/空结果的callback不能进入
- Node.js等到asynchronous函数完成,然后继续执行其余的代码
- 如何在node.js中逐行运行代码
- 只能发出一个GET请求,而不会出现错误:“发送后无法设置标题”。
- pipe理asynchronous性并在节点中执行多个MySQL查询
- 如何处理需要两个asynchronous方法的node / express的请求
- 在if语句中使用child_process.exec的返回值?