Await不适用于nodejs中的函数调用?

问题描述 投票:2回答:2

我有一个名为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
2个回答
2
投票

问题是在looper 2函数中你在for循环之后立即解决并且不等待db查询完成。您应该在db查询全部完成后解决

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)
                }
            });
        }
    });
}

1
投票

没有异步功能就不能使用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)
}
© www.soinside.com 2019 - 2024. All rights reserved.