第一次写 node.js , 调用 async. waterfall 里进行 mysql 嵌套循环查询, callback is not a function,有偿咨询…… - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Rorysky
7.1D

第一次写 node.js , 调用 async. waterfall 里进行 mysql 嵌套循环查询, callback is not a function,有偿咨询……

  •  
  •   Rorysky 2018 年 4 月 5 日 5826 次点击
    这是一个创建于 2942 天前的主题,其中的信息可能已经有所发展或是发生改变。

    总是提示 callback is not a function …… 难道回调格式错了?

    主要想实现的逻辑是 操作 mysql 数据库,以第一次查询的结果为条件进行第二次查询,以第二次查询结果为条件进行第三次查询。

     promobOnus= function (eigencode, callback){ async.waterfall([ function(eigencode,callback){ pool.query(sql+"promocode = ?",[eigencode+''],function(err,subresult1){ if(err || subresult1.length<1){ err='sql first level quering erro or result is null'; } else { }; console.log('1 '+typeof(callback)); callback(err,subresult1); }); },function(subresult1,callback) { var sqlele=[],eigenele=[]; for(var x of subresult1){ sqlele.push("promocode= ? OR"); eigenele.push(x.eigencode); }; var sqltmp=sqlele.join(' '); var sqlnew=sql+sqltmp.substring(0,sqltmp.length-2); pool.query(sqlnew,[eigenele+''],function(err,subresult2){ if(err || subresult2.length<1){ err='sql second level quering erro or result is null'; } else { }; console.log('2 '+typeof(callback)); callback(err,subresult2); }); },function(subresult2,callback){ var sqlele2=[],eigenele2=[]; for(var y of subresult2){ sqlele2.push("promocode= ? OR"); eigenele2.push(y.eigencode); }; var sqltmp2=sqlele2.join(' '); var sqlnew2=sql+sqltmp2.substring(0,sqltmp2.length-2); pool.query(sqlnew2,[eigenele2+''],function(err,subresult3){ if(err || subresult3.length<1){ err='sql third level quering erro or result is null'; } else { }; console.log('3 '+typeof(callback)); callback(err,subresult3); }); } ], function (err,subresult3) { if(err) { console.log(err); } console.log('4 '+typeof(callback)); callback(err,subresult3); }); }; 
    10 条回复    2018-04-05 20:15:41 +08:00
    helloworld12
        1
    helloworld12  
       2018 年 4 月 5 日   1
    用 es6 的 async 和 await 啊 ,不要用这个
    wotemelon
        2
    wotemelon  
       2018 年 4 月 5 日   1
    纠正楼上,async await 属于 es7.
    升级 nodejs 到 8 LTS 以上,支持 async await 写法,谁写谁怀孕
    0754
        3
    0754  
       2018 年 4 月 5 日   1
    干嘛不用 async/await,这个看着就蛋疼...

    第一个函数
    function(eigencode,callback)
    改成
    function(callback)
    noe132
        4
    noe132  
       2018 年 4 月 5 日   1
    还有空格 tab 混用。。。
    dingtian
        5
    dingtian  
       2018 年 4 月 5 日   1
    其实 es6 的 Promise 也可以了解一下。。。
    Rorysky
        6
    Rorysky  
    OP
       2018 年 4 月 5 日
    @dd0754 感谢!不报错了; 其实一开始只看了 js 基本语法,第一个版本是用回调嵌套写的…… 感觉写出来简直 shit 一样,改成这个 waterfall 流程控制了……

    再请教一下 为什么把第一个参数 eigencode 去掉就可以了。
    vcfvct
        7
    vcfvct  
       2018 年 4 月 5 日 via Android
    都 2018 了,还是直接用 asycn await 吧。。。
    Cbdy
        8
    Cbdy  
       2018 年 4 月 5 日 via Android
    @wotemelon 纠正一下,async,await 似乎属于 es2017
    whypool
        9
    whypool  
       2018 年 4 月 5 日
    数据库查询,逻辑控制,分开写
    数据表查询返回一个 promise,调用直接 await 就行,不用回调
    zgk
        10
    zgk  
       2018 年 4 月 5 日
    写了个楼上提到的 Promise 和 async/await 的示例,希望可以带来帮助

    ```
    // 把回调包装成 Promise
    function run(sql, params) {
    return new Promise(function (resolve, reject) {
    pool.query(sql, params, function (err, data) {
    if (err) return reject(err);
    resolve(data);
    });
    })
    }

    // Promise 方式执行
    run('SELECT * FROM .....')
    .then(function (data) {
    // 第一次查询以后
    return run('SELECT * FROM ....', data.xxx);
    })
    .then(function (data) {
    // 第二次查询以后
    return run('SELECT * FROM ....', data.yyy);
    })
    .then(function (data) {
    // 第三次查询以后
    })
    .catch(function (error) {
    // 错误情况
    console.log(error);
    });

    // async/await 方式
    async function runAsync() {
    try {
    let result1 = await run('SELECT * FROM ....');
    let result2 = await run('SELECT * FROM .... WHERE a = ?', result1.xxx);
    let result3 = await run('SELECT * FROM .... WHERE a = ?', result2.yyy);
    } catch (error) {
    console.log(error);
    }
    }

    runAsync();

    ```

    个人感觉 Promise 的形式假如有中间需要跳出的逻辑的话,手动构造一堆 Promise.resolve() 然后还好多 if 判断不太方便,async/await 舒服多了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2823 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 80ms UTC 01:40 PVG 09:40 LAX 18:40 JFK 21:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86