javascript - 使用异步队列时应该使用回调吗?

标签 javascript node.js asynchronous

我正在使用 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/

相关文章:

html - Nodejs | npm : html-pdf, 设置pdf页面的高度

node.js - Visual Studio代码: Deploy to azure appears to work but no files seem to transfer

c# - 如何判断失败的方法调用参数值?

python - Asyncio执行流程问题

javascript - jQuery 分析 - 测量完整的 onReady 运行时

javascript - 在 JS 中创建一个由 native 属性组成的对象构造函数(无 jQuery)

javascript - Angular - 修改 innerHTML

javascript - Node.js - 如何在不超过速率限制的情况下在 for 循环中调用 Facebook API?

javascript - 我正在尝试使用 Bluebird 的方法 Promisify,但它不起作用

Javascript++ -- 帮助