我正在Nodejs中构建服务器以从某个数据库中检索数据。我已经使用异步库了一段时间了,想出了一些事情,比如将瀑布放在并行函数中。
我偶然发现了一个问题,我首先需要执行一个查询,然后在其他可以同时执行的查询中使用该查询的结果。代码看起来像这样:
async.waterfall([
function(callback) {
connection.query( query,
function(err, rows, fields) {
if (!err) {
callback(null,rows);
} else {
callback(null,"SORRY");
}
}
);
},
async.parallel([
function(resultFromWaterfall,callback) {
connection.query(query,
function(err, rows, fields) {
if (!err) {
callback(null,rows);
} else {
callback(null,"SORRY");
}
}
);
},
function(resultFromWaterfall,callback) {
connection.query(query,
function(err, rows, fields) {
if (!err) {
callback(null,rows);
} else {
callback(null,"SORRY");
}
}
);
}
])
], finalCallback
);
现在我的问题是从瀑布函数访问结果并在并行函数中使用它。
答案 0 :(得分:3)
async.waterfall([
function(callback) {
connection.query(query,
function(err, rows, fields) {
if (!err) {
callback(null, rows);
} else {
callback(null, "SORRY");
}
}
);
},
function(prevData,callback){
console.log(prevData);//Use it whereever you want.
async.parallel([
function(callbackOfAsyncParallel) {
connection.query(query1,
function(err, rows1, fields1) {
if (!err) {
callbackOfAsyncParallel(null, rows1);
} else {
callbackOfAsyncParallel(null, "SORRY1");
}
}
);
},
function(callback) {
connection.query(query2,
function(err, rows2, fields2) {
if (!err) {
callbackOfAsyncParallel(null, rows2);
} else {
callbackOfAsyncParallel(null, "SORRY2");
}
}
);
}
],function mainCBOfParallel(err,reuslts){
if(!err){
//this will be done after tasks in async.parallel are finished.
callback(null,results);
//results[0]===>rows1
//results[1]===>rows2
}
});
}
], finalCallback);
您的代码中有两个错误,
将会调用回调(
callbackOfAsyncParallel
) 当async.parallel
中的任务完成时。它不应该调用
callback
的回调(async.waterfall
)。如果 完成可能会有错误/意外结果。
答案 1 :(得分:1)
试试这个..
async.waterfall([
function(callback) {
connection.query(query,
function(err, rows, fields) {
if (!err) {
callback(null, rows);
} else {
callback(null, "SORRY");
}
}
);
},
function(resultFromWaterfall, callback) {
async.parallel([
function() {
connection.query(query,
function(err, rows, fields) {
if (!err) {
callback(null, rows);
} else {
callback(null, "SORRY");
}
}
);
},
function() {
connection.query(query,
function(err, rows, fields) {
if (!err) {
callback(null, rows);
} else {
callback(null, "SORRY");
}
}
);
}
]);
}
], finalCallback);
答案 2 :(得分:0)
doWhatever(callback) {
async.waterfall([
(waterfallCallback) => {
connection.query(query, waterfallCallback);
},
(rows, fields, waterfallCallback) => {
async.parallel([
(parallelCallback) => {
connection.query(query, parallelCallback);
},
(parallelCallback) => {
connection.query(query, parallelCallback);
}
], waterfallCallback);
}
], callback);
},
那只是我想让它更清楚……
无论如何,我的示例没有考虑查询的参数和参数。只是脚手架而已