В моем приложении есть аналогичный КОНЦЕПТ-код, который фактически использует данные через 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 на самом деле ничего не помогло.
Любые отзывы будут высоко оценены. Заранее спасибо.