У меня есть таблица, где люди сохраняют свое время (в секундах), где они были активны. Я хотел бы написать функцию, которая собирает общее время в другой таблице с именем gather
.Результаты сбора синхронных вызовов node.js
Для каждой строки я проверяю, существует ли запись в таблице gather
. В зависимости от этого результата я делаю вставку или обновление.
db.serialize(function() {
db.each("SELECT * from TEST", function(err, row) {
db.get("SELECT * from GATHER where name = " + row.name "", function(err, row) {
if(row === undefined || row === null){
var stmt = db.prepare("INSTER INTO gather (name, time) VALUE(?,?)");
stmt.run([name, seconds], function(error){
console.log('lastInsert ' + this.lastID);
});
stmt.finalize();
}else{
seconds += row.time;//increment time
var stmt = db.prepare("UPDATE gather SET time = ? WHERE name = ?");
stmt.run([seconds, row.name], function(error){
console.log('lastInsert ' + row.idProcessed);
});
stmt.finalize();
}
});
});
});
Проблема, заключающаяся в том, что sqlite работает асинхронно. Поэтому в моей таблице gather
создано несколько записей, хотя строки должны быть обновлены.
Что было бы правильным способом запустить эту функцию синхронно? Должен ли я ограничивать линии и вызывать функцию каждую секунду или есть умный способ?
Semms как умный способ! Проблема все же остается прежней. Db.each будет выдавать сразу несколько строк, и я бы хотел сказать, что он явно обрабатывает один за другим, потому что каждая строка зависит от результата раньше. – Silve2611
@ Silve2611 Привет, вы решили свою проблему? Я не комментировал здесь раньше, потому что был очень шумным, но вы можете использовать everySeries для выполнения цикла for по результатам массива первого запроса. – Gepser
Я нашел решение со временем, которое работает для меня, но я не уверен, что он самый умный. Я не уверен, что могу применить каждую серию здесь. db.get возвращает только первую строку. db.each не вернет массив, но даст мне обратный вызов, который будет работать асинхронно. Вы видите более разумное решение? Я мог бы также опубликовать мой. – Silve2611