使用 async.js 系列识别回调数据
Identifying callback data with async.js series
我正在使用 async.js 调用 3 个异步函数,这些函数 运行 数据库查询和 return 它们在下面列出的最终函数的 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. 序数 - resultA 位于索引 0,resultB 位于索引 1,resultC 位于索引 2。 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.
}
});
</pre>
3. 检查数据以确定哪个查询 运行.
我不喜欢 3,因为它将数据库模式与代码紧密耦合(我只是为了完整性才包含它)。但我不太确定是 1 还是 2 更好。由于 async.js 文档仅 暗示 结果的顺序反映了数组中异步函数的顺序,我倾向于选项 2。
高于一切。为什么我什至有这个问题。也许我使用的 async.js 库不正确?
SO post Nodejs async series - pass arguments to next callback 中的问题 提供了答案。
通过为 async.series()
提供 对象 而不是 数组 ,每个异步函数都成为一个对象 属性 因此有一个 key。密钥可用于识别结果。
应用于我的示例,它看起来像:
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
});
我正在使用 async.js 调用 3 个异步函数,这些函数 运行 数据库查询和 return 它们在下面列出的最终函数的 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. 序数 - resultA 位于索引 0,resultB 位于索引 1,resultC 位于索引 2。 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. } }); </pre>
3. 检查数据以确定哪个查询 运行.
我不喜欢 3,因为它将数据库模式与代码紧密耦合(我只是为了完整性才包含它)。但我不太确定是 1 还是 2 更好。由于 async.js 文档仅 暗示 结果的顺序反映了数组中异步函数的顺序,我倾向于选项 2。
高于一切。为什么我什至有这个问题。也许我使用的 async.js 库不正确?
SO post Nodejs async series - pass arguments to next callback 中的问题 提供了答案。
通过为 async.series()
提供 对象 而不是 数组 ,每个异步函数都成为一个对象 属性 因此有一个 key。密钥可用于识别结果。
应用于我的示例,它看起来像:
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
});