Javascript вложенных обратных вызовов в цикле for - PullRequest
0 голосов
/ 27 мая 2020

У меня есть вложенные функции, которые не должны блокировать ввод-вывод.

 for(let i = 1; i < category_amount;i++){
        pool.query('SELECT COUNT(1) FROM threads_mphp WHERE category = ?',i,function(error, results1, fields) {
            console.log(i);
            pool.query('UPDATE category SET posts=? where category=?',[results1[0]['COUNT(1)'],i],function() {
                console.log(i);
            });
        });
    }

Оба запроса работают с одним и тем же индексом i. Я не могу использовать let для таких целей. Console.logs не выводит, как ожидалось, два одинаковых числа подряд. Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 27 мая 2020

Я не верю, что здесь есть проблема. Функция обратного вызова (function(error, results1, fields)...) и последующий оператор UPDATE вызываются только после получения результатов pool.query. В результате журналы могут отображаться не по порядку, поскольку вы создаете вызовы pool.query так быстро, как это позволяет вам в l oop.

Добавьте оператор ведения журнала перед pool.query, чтобы точно увидеть что происходит. Я считаю, что журнал будет выглядеть примерно так:

1 query! - called from loop
2 query! - called from loop
3 query! - called from loop
1 SELECT finished! - 1st callback is invoked and UPDATE dispatched.
4 query! - loop is still running!
2 SELECT finished!
1 UPDATE finished!
3 SELECT finished!
2 UPDATE finished!
...
for(let i = 1; i < category_amount;i++){
        console.log(`${i} query!`);
        pool.query('SELECT COUNT(1) FROM threads_mphp WHERE category = ?',i,function(error, results1, fields) {
            console.log(`${i} SELECT finished`);
            pool.query('UPDATE category SET posts=? where category=?',[results1[0]['COUNT(1)'],i],function() {
                console.log(`${i} UPDATE finished`);
            });
        });
    }
...