Как последовательно выполнить несколько запросов / операций ввода-вывода для l oop in NodeJS? - PullRequest
0 голосов
/ 16 января 2020

В моем приложении есть аналогичный КОНЦЕПТ-код, который фактически использует данные через Rabbit MQ и отправляет их через Event Emitter. Я хочу обрабатывать данные последовательно, поэтому я унаследовал функциональность async / await для своего приложения. Однако он работает не по порядку, вот аналогичный пример кода.

const mysql = require('mysql2');
const pool = mysql.createPool({ host: 'localhost', user: 'root', database: 'sample' })
const promisePool = pool.promise();

const events = require('events');
const em = new events.EventEmitter();

setInterval(() => {

    let data = [{
        queData: [{
            clientId: 1,
            device_id: 39,
            latitude: -32.0863994,
            investigation_id: 40,
            longitude: 115.9153126
        }],
        commit: () => {
            console.log("DONE")
        }
    }]

    data.forEach(element => {
        em.emit('NEW_EVENT', element);
    });
}, 1);

em.addListener('NEW_EVENT', async (qResult) => {


    let dataArray = qResult.queData[0];

    const [rows, fields] = await promisePool.query("SELECT * FROM geo_data WHERE investigation_id = ? ", [dataArray.investigation_id]);
    console.log("RESULT - 1");
    for (let value of rows) {

        let [rows2, fields2] = await promisePool.query("SELECT * FROM users WHERE geo_id = ? ", [value.id]);
        console.log("RESULT - 2");

        let [rows3, fields4] = await promisePool.query("SELECT * FROM user_info WHERE id = ? ", [rows2.user_id]);
        console.log("RESULT - 3");

        console.log("INSIDE LOOP AFTER ALL QUERY");
    }
    console.log("ALL QUERIES ARE DONE");
}); 

А вот выходной журнал:

RESULT - 1
RESULT - 2
RESULT - 1
RESULT - 1
RESULT - 1
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
RESULT - 2
RESULT - 2
RESULT - 2
RESULT - 1
RESULT - 1
RESULT - 2
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
RESULT - 2
RESULT - 2
RESULT - 2
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
RESULT - 2
RESULT - 1
RESULT - 2
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
RESULT - 1
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
RESULT - 2
RESULT - 2
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
RESULT - 2
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
RESULT - 2
RESULT - 1
RESULT - 2
RESULT - 2
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
ALL QUERIES ARE DONE

То, что я ожидал, это

RESULT - 1
RESULT - 2
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
ALL QUERIES ARE DONE
RESULT - 1
RESULT - 2
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
ALL QUERIES ARE DONE
RESULT - 1
RESULT - 2
RESULT - 3
INSIDE LOOP AFTER ALL QUERY
ALL QUERIES ARE DONE

Как я могу выполнить это последовательно? Я пробовал foreach / Map на самом деле ничего не помогло.

Любые отзывы будут высоко оценены. Заранее спасибо.

1 Ответ

1 голос
/ 16 января 2020

Измените ваш обработчик NEW_EVENT на запуск только после завершения последнего обработчика:

let lastProm = Promise.resolve();
em.addListener('NEW_EVENT', (qResult) => {
    lastProm = lastProm.then(async () => {
      let dataArray = qResult.queData[0];

      const [rows, fields] = await promisePool.query("SELECT * FROM geo_data WHERE investigation_id = ? ", [dataArray.investigation_id]);
      console.log("RESULT - 1");
      for (let value of rows) {

          let [rows2, fields2] = await promisePool.query("SELECT * FROM users WHERE geo_id = ? ", [value.id]);
          console.log("RESULT - 2");

          let [rows3, fields4] = await promisePool.query("SELECT * FROM user_info WHERE id = ? ", [rows2.user_id]);
          console.log("RESULT - 3");

          console.log("INSIDE LOOP AFTER ALL QUERY");
      }
      console.log("ALL QUERIES ARE DONE");
    });
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...