Node.js中的多个并发操作

Node.js中的多个并发操作,node.js,Node.js,我想知道在node.js中处理多个并发操作的最佳方法是什么。例如,假设一个给定的HTTP请求需要进行3次数据库查询才能呈现响应,但每个请求都是独立的。我当前的naive实现是这样工作的(在伪代码中) 有更好的方法吗?等待每个查询的响应启动下一个查询似乎是浪费时间。您应该使用流控制库,如async 或步骤 编辑:添加了一个使用async的示例 async.parallel([ function(callback){ doRequest1(query, callback)

我想知道在node.js中处理多个并发操作的最佳方法是什么。例如,假设一个给定的HTTP请求需要进行3次数据库查询才能呈现响应,但每个请求都是独立的。我当前的naive实现是这样工作的(在伪代码中)


有更好的方法吗?等待每个查询的响应启动下一个查询似乎是浪费时间。

您应该使用流控制库,如async

或步骤

编辑:添加了一个使用async的示例

async.parallel([
    function(callback){
        doRequest1(query, callback);
    },
    function(callback){
        doRequest2(query2, callback);
    },
    function(callback){
        doRequest3(query3, callback);
    },
],
function(err, results){
    if (err) {
        renderError(err);
    } else {
        renderHTML(results[0], results[1], results[2]);
    }
});

如果要使每个函数以串行方式运行(等待上一个函数完成),可以使用async.series而不是async.parallel。如果查询依赖于以前查询的结果,则可以使用async.瀑布。如果查询之间存在复杂的依赖关系图,则可以使用async.auto。

Gruikya的回答说明了您应该做什么,下面是它在幕后的工作方式:

var unfinished = 3
var noop = function() {}
var data1, data2, data3
doRequest1(query1, function(err, results) {
  if (err) return cb(err), cb = noop
  data1 = results
  if (--unfinished === 0) done()
}
doRequest2(query2, function(err, results) {
  if (err) return cb(err), cb = noop
  data2 = results
  if (--unfinished === 0) done()
}
doRequest3(query3, function(err, results) {
  if (err) return cb(err), cb = noop
  data3 = results
  if (--unfinished === 0) done()
}
function done() {
  // do stuff with the data here
  cb(null) // everything ok
}
使用ES6功能进行更新

您可以使用
async/await
语法和
Promise.all
方法在一行中获得相同的结果,而无需回调:

const allRequests=[doRequest1(查询)、doRequest2(someQuery)、doRequest3(someQuery)]
const[response1,response2,response3]=等待承诺。全部(所有请求)
var unfinished = 3
var noop = function() {}
var data1, data2, data3
doRequest1(query1, function(err, results) {
  if (err) return cb(err), cb = noop
  data1 = results
  if (--unfinished === 0) done()
}
doRequest2(query2, function(err, results) {
  if (err) return cb(err), cb = noop
  data2 = results
  if (--unfinished === 0) done()
}
doRequest3(query3, function(err, results) {
  if (err) return cb(err), cb = noop
  data3 = results
  if (--unfinished === 0) done()
}
function done() {
  // do stuff with the data here
  cb(null) // everything ok
}