Javascript for 循环中的嵌套回调
Javascript nested callbacks in for loop
我有嵌套函数,它们不应阻塞 I/O。
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 没有按预期连续输出两个相同的数字。
我该如何解决这个问题?
我认为这里没有问题。只有在 pool.query
的结果完成时,才会调用回调函数 (function(error, results1, fields)...
) 和后续的 UPDATE 语句。因此,日志可能会出现乱序,因为您正在以允许您进入循环的速度快速生成 pool.query
调用。
在 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`);
});
});
}
我有嵌套函数,它们不应阻塞 I/O。
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 没有按预期连续输出两个相同的数字。 我该如何解决这个问题?
我认为这里没有问题。只有在 pool.query
的结果完成时,才会调用回调函数 (function(error, results1, fields)...
) 和后续的 UPDATE 语句。因此,日志可能会出现乱序,因为您正在以允许您进入循环的速度快速生成 pool.query
调用。
在 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`);
});
});
}