我使用async.js调用3个运行数据库查询的异步函数,并将其数据返回到下面列出的最终函数的results[]
参数中:
async.series([
function(callback) {
datasetA.fetch(sqlQueryA).then(function(data) {
callback(null, data);
});
},
function(callback) {
datasetB.fetch(sqlQueryB).then(function(data) {
callback(null, data);
});
},
function(callback) {
datasetC.fetch(sqlQueryC).then(function(data) {
callback(null, data);
});
}
], function(error, results) {
// Results is array of data containing
// resultA, resultB, resultC.
});
我理解所有三个异步函数的结果都在results[]
参数中。但是,从每个查询中识别结果的最佳方法是什么?我可以想到三种方式:
1。 Ordinal - resultA将在索引0处,resultB在索引1处,resultC将在index2处。这显然隐含在async.js文档中,但没有明确说明。
2. :在调用async.js callback(null, data)
之前修改回调参数:
async.series([
function(callback) {
datasetA.fetch(sqlQuery).then(function(data) {
data['query'] = 'A';
callback(null, data);
});
},
function(callback) {
datasetB.fetch(sqlQuery).then(function(data) {
data['query'] = 'B';
callback(null, data);
});
},
function(callback) {
datasetC.fetch(sqlQuery).then(function(data) {
data['query'] = 'C';
callback(null, data);
});
}
], function(error, results) {
for (var i=0; i < results.length; i++) {
// results[i].query will be A, B or C.
}
});
3. 检查数据以确定运行了哪个查询。
我不喜欢3,因为它将数据库架构与代码紧密耦合(我只是为了完整性而包含它)。但我不太确定1或2是否更好。由于async.js文档只有暗示结果的顺序反映了数组中异步函数的顺序,所以我倾向于选项2.
最重要的是。为什么我甚至遇到这个问题。也许我错误地使用了async.js库?
答案 0 :(得分:1)
SO帖子Nodejs async series - pass arguments to next callback中的问题提供了答案。
通过为async.series()
提供对象而不是数组,每个异步函数都会成为对象属性,因此具有的键即可。密钥可用于识别结果。
应用于我的示例,它看起来像:
async.series({
A: function(callback){
datasetA.fetch(sqlQueryA).then(function(data) {
callback(null, data);
});
},
B: function(callback){
datasetB.fetch(sqlQueryB).then(function(data) {
callback(null, data);
});
},
C: function(callback){
datasetC.fetch(sqlQueryC).then(function(data) {
callback(null, data);
});
}
},
function(err, results) {
// results.A
// results.B
// results.C
});