【问题标题】:Await is not working for function call in nodejs?等待不适用于nodejs中的函数调用?
【发布时间】:2019-09-18 17:21:57
【问题描述】:

我有一个名为 looper2() 的函数,它接受一个数据数组,我试图从 mysql 数据库中获取每个数据的 id。一切正常,但我的 nodejs 不等待函数,当它仍然代表等待。

var noloop = [];
noloop = await looper2(json_array1);
console.log("db id returns",noloop)

console.log("no loop",noloop[0]); //im getting this undefined

function looper2(){
    return new Promise(function(resolve, reject) {
        // Do async job
        for(var i=0;i<json_array1.length;i++){
            var sl =  "select id from json where name ="+db.escape(json_array1[i]);
            db.query(sl, function(err,result) {
                if (err) throw err;
                console.log("individual id:", result)
                noloop.push(result)
            });
           }
           resolve(noloop)
    });

}

【问题讨论】:

    标签: node.js for-loop promise async-await


    【解决方案1】:

    问题在于,在 looper2 函数中,您在 forLoop 之后立即解析,而不是等待数据库查询完成。您应该在数据库查询全部完成后解决

    function looper2(){
           return new Promise(function(resolve, reject) {
            // Do async job
            for(var i=0;i<json_array1.length;i++){
                var sl =  "select id from json where name ="+db.escape(json_array1[i]);
                db.query(sl, function(err,result) {
                    if (err) throw err;
                    console.log("individual id:", result)
                    noloop.push(result)
                    if(noloop.length == json_array1.length) {
                         resolve(noloop)
                    }
                });
            }
        });
    }
    

    【讨论】:

    • 很高兴能帮上忙 :-)
    【解决方案2】:

    你不能使用没有异步功能的等待。因此,您必须创建一个自执行函数才能使用 await,如下所示。如果您在循环中使用 promise,则可以使用 promise.all 函数,您可以使用它来解决所有待处理的 promise。

    (async () => {
       var noloop = [];
       noloop = await looper2(json_array1);
       console.log(noloop);
    })();
    
    function async looper2(){
    const promises = [];
     for(var i=0;i<json_array1.length;i++){
         var sl =  "select id from json where name ="+db.escape(json_array1[i]);
         db.query(sl, function(err,result) {
            if (err) throw err;
                 promises.push(new Promise(result));
             });
          }
       return Promise.all(promises)
    }
    

    【讨论】:

    • 它在一个异步函数中,我的问题是 nodejs 没有等待 looper2() 结果返回..
    • @sachinmurali 您能否更改您的代码以向我们展示它在异步函数中的确切情况?没有它,我们只能根据您向我们展示的内容来回答,而您展示的代码的答案是它不起作用,因为它不在异步函数中
    • 答案已更新,请查看。 @sachinmurali
    猜你喜欢
    • 2019-11-19
    • 2021-03-29
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2020-12-13
    • 2023-03-30
    相关资源
    最近更新 更多