Await не работает для вызова функции в nodejs? - PullRequest
2 голосов
/ 30 апреля 2019

У меня есть функция по имени looper2 (), которая принимает массив данных, и я пытаюсь получить идентификатор каждого из данных из базы данных mysql. Все работает нормально, но мой 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)
    });

}

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Проблема в том, что в функции 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)
                }
            });
        }
    });
}
1 голос
/ 30 апреля 2019

Вы не можете использовать await без асинхронной функции. Итак, вы должны создать самозапускаемую функцию для использования await, как показано ниже. И если вы используете обещание внутри цикла, доступна функция promise.all, вы можете использовать для разрешения всех ожидающих обещаний.

(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)
}
...