我想知道在node.js中处理多个并发操作的最佳方法是什么.例如,假设给定的HTTP请求在呈现响应之前需要进行3次数据库查询,但每个请求都是独立的.我目前的天真实现就像这样(伪代码)
doRequest1(query, function (response1) {
doRequest2(someQuery, function (response2) {
doRequest3(someQuery, function (response3) {
renderHTML(response1,response2,response3);
});
});
});
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?等待对每个查询的响应以启动下一个查询似乎很浪费.
您应该使用流控制库,如异步
https://github.com/caolan/async
或者步骤
https://github.com/creationix/step
编辑:添加了一个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]);
}
});
Run Code Online (Sandbox Code Playgroud)
如果要使每个函数以序列形式运行(等待上一个函数完成),则可以使用async.series而不是async.parallel.如果查询依赖于先前查询的结果,则可以使用async.waterfall.如果查询之间存在复杂的依赖关系图,则可以使用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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1300 次 |
| 最近记录: |