当使用异步队列时,我应该使用回调吗?
Should I use a callback when using an async queue?
我使用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
)来控制并行度级别。
相关文章:
- AngularJS:我可以跳过函数参数回调吗
- 为什么我的回调函数没有运行
- 不同'单击'不同脚本中的回调:我可以控制执行顺序吗
- Ember我如何知道路由模板何时完成加载并触发回调
- 为什么我可以't直接将console.log()设置为回调函数
- 当我的单元测试失败时,回调被调用了两次
- 当使用命名函数作为jquery ajax成功回调时,我需要括号吗
- 为什么chrome.debugger.attach 回调函数应该像cb.bind(null,..)一样使用
- 在 JavaScript 中,我应该使用带有回调的 return 吗?
- 我的函数应该通过.fail()回调为Ajax请求返回什么
- 给一个提供的NodeJS回调我自己的自定义回调
- OO Javascript回调:我做得对吗
- JavaScript异步查询:我应该把回调在每个方法或对象
- 在等待$onInit回调完成时,我应该为Angular绑定的属性返回什么?
- 如果我没有在回调中使用' this '关键字,我应该使用可选的context参数吗?
- 访问& # 39;这个# 39;回调函数内部应该引用我的数组
- JavaScript:线程安全与异步事件回调?(我需要'挥发物'还是什么?)
- 我应该有一个回调吗?
- 当使用异步队列时,我应该使用回调吗?
- 我应该返回回调还是直接运行它