Всякий раз, когда я запускаю свою функцию «save_to_db» в местоположении B, она не срабатывает.
Код ниже показывает проблему ...
//location A
var i = 0;
while(true)
{
i++;
if(i == 100)
{
//location B
save_to_db(newUnit, 11214.1, 'TEST');
}
}
//location C
Функция 'save_to_db' отлично работает в местоположении A и C. Но не работает в местоположении B.
Я думаю, это потому, что цикл while бесконечен и синхронизирован. Следовательно, это не дает узлу возможность запустить цикл обработки событий. Как мы можем должным образом дать нодзйс шанс запустить цикл обработки событий в этом случае?
===================== Обновления ======================== ======
Код выше является очень упрощенной версией кода. У меня есть класс / модуль с именем «db_util», и у него есть два метода, «save_to_db» и «read_from_db». Я думаю, что из-за этих методов используется модуль «mysql», они обращаются к базе данных асинхронным способом. Но мой пока истинный цикл блокирует nodejs eventloop. Поэтому ни один из методов в цикле while не может быть вызван.
var mysql = require('mysql');
var db_util = function()
{}
db_util.prototype = {
save_to_db: function (neural_network, fitness, type) {
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'nodejstestdb'
});
connection.connect();
var addSql = 'INSERT INTO mytable(id, nn, type, fitness) VALUES(?,?,?,?)';
var addSqlParams = [null, neural_network, type, fitness];
connection.query(addSql, addSqlParams, function (err, result) {
if (err) {
console.log('[INSERT ERROR] - ', err.message);
return;
}
console.log('INSERT ID:', result);
});
connection.end();
},
read_from_db:function(){
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'nodejstestdb'
});
connection.connect();
var sql = 'SELECT * FROM mytable ORDER BY fitness DESC';
connection.query(sql, function (err, result) {
if (err) {
console.log('[SELECT ERROR] - ', err.message);
return;
}
console.log(result);
var nn = result[0].nn;
neural_network = synaptic.Network.fromJSON(JSON.parse(nn));
return neural_network;
});
connection.end();
}
}
module.exports = db_util;
================ обновление 2 из-за ответов
let i = 0;
(function tick() {
++i;
if (i%100 == 0) {
save_to_db();
}
setTimeout(tick, 0); // Queue a callback on next(ish) event loop cycle
}());
let i = 0;
tick();
@T.J. Crowder, сэр, спасибо за ваш ответ. Но в чем разница между вашим кодом выше и кодом ниже?
var i = 0;
function tick() {
++i;
if (i%100 == 0) {
save_to_db();
}
setTimeout(tick, 0); // Queue a callback on next(ish) event loop cycle
}
tick();