使用 Async.js 查询三条 SQL 语句并返回结果:
var sqls = {
table_a: "select count(*) from table_a",
table_b: "select count(*) from table_b",
table_c: "select count(*) from table_c"
};
async.map(sqls, function(item, callback) {
connection.query(item, function(err, results) {
callback(err, results);
});
}, function(err, results) {
if(err) {
console.log(err);
} else {
console.log(results);
}
});
可以输出:
{ table_a: [ { 'count(*)': 26 } ],
table_b: [ { 'count(*)': 3 } ],
table_c: [ { 'count(*)': 2 } ] }
根据 map 函数的文档:
arr - An array to iterate over.
iterator(item, callback) - A function to apply to each item in arr. The iterator is passed a callback(err, transformed) which must be called once it has completed with an error (which can be null) and a transformed item.
callback(err, results) - Optional A callback which is called when all iterator functions have finished, or an error occurs. Results is an array of the transformed items from the arr.
connection.query 函数符合第二个参数 iterator(item, callback)。
为什么以下的使用方式会报错:
var sqls = {
table_a: "select count(*) from table_a",
table_b: "select count(*) from table_b",
table_c: "select count(*) from table_c"
};
async.map(sqls, connection.query, function(err, results) {
if(err) {
console.log(err);
} else {
console.log(results);
}
});
TypeError: Cannot read property 'typeCast' of undefined
1
allenfantasy 2015-12-23 10:07:23 +08:00
`arr - An array to iterate over`
但是你的 sqls 变量不是一个 array 啊 |
2
wucao219101 OP @allenfantasy map 好像是支持 Object 的,虽然文档上写的是 array 。
|
3
ablula 2015-12-23 12:57:31 +08:00 1
@wucao219101 改成:
``` async.map(sqls, connection.query.bind(connection), function(err, results) { if(err) { console.log(err); } else { console.log(results); } }); ``` |
4
wucao219101 OP @sweetvvck 的确可以,大神能不能解释一下?
|
5
EPr2hh6LADQWqRVH 2015-12-23 13:01:34 +08:00
this
|
6
ablula 2015-12-23 13:08:47 +08:00
@wucao219101 直接将方法(connection.query)当参数传入另一个方法(async.map)默认会改变作为参数的方法的上下文(就是 @avastms 说的 this),所以需要 bind 一下正确的上下文;
|