
使用 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 @wucao219101 改成: ``` async.map(sqls, connection.query.bind(connection), function(err, results) { if(err) { console.log(er); } 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 一下正确的上下文; |