V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wucao219101
V2EX  ›  Node.js

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

  •  
  •   wucao219101 · 2015-12-23 09:57:21 +08:00 · 3360 次点击
    这是一个创建于 3260 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 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
    
    6 条回复    2015-12-23 13:08:47 +08:00
    allenfantasy
        1
    allenfantasy  
       2015-12-23 10:07:23 +08:00
    `arr - An array to iterate over`

    但是你的 sqls 变量不是一个 array 啊
    wucao219101
        2
    wucao219101  
    OP
       2015-12-23 10:16:39 +08:00
    @allenfantasy map 好像是支持 Object 的,虽然文档上写的是 array 。
    ablula
        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);
    }
    });
    ```
    wucao219101
        4
    wucao219101  
    OP
       2015-12-23 13:00:30 +08:00
    @sweetvvck 的确可以,大神能不能解释一下?
    EPr2hh6LADQWqRVH
        5
    EPr2hh6LADQWqRVH  
       2015-12-23 13:01:34 +08:00
    this
    ablula
        6
    ablula  
       2015-12-23 13:08:47 +08:00
    @wucao219101 直接将方法(connection.query)当参数传入另一个方法(async.map)默认会改变作为参数的方法的上下文(就是 @avastms 说的 this),所以需要 bind 一下正确的上下文;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:08 · PVG 11:08 · LAX 19:08 · JFK 22:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.