Node.js Async.js 结合 node-mysql 使用的疑问

2015-12-23 09:57:21 +08:00
 wucao219101
使用 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
```
3225 次点击
所在节点    Node.js
6 条回复
allenfantasy
2015-12-23 10:07:23 +08:00
`arr - An array to iterate over`

但是你的 sqls 变量不是一个 array 啊
wucao219101
2015-12-23 10:16:39 +08:00
@allenfantasy map 好像是支持 Object 的,虽然文档上写的是 array 。
ablula
2015-12-23 12:57:31 +08:00
@wucao219101 改成:
```
async.map(sqls, connection.query.bind(connection), function(err, results) {
if(err) {
console.log(err);
} else {
console.log(results);
}
});
```
wucao219101
2015-12-23 13:00:30 +08:00
@sweetvvck 的确可以,大神能不能解释一下?
EPr2hh6LADQWqRVH
2015-12-23 13:01:34 +08:00
this
ablula
2015-12-23 13:08:47 +08:00
@wucao219101 直接将方法(connection.query)当参数传入另一个方法(async.map)默认会改变作为参数的方法的上下文(就是 @avastms 说的 this),所以需要 bind 一下正确的上下文;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/245518

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX