请检查以下示例函数是否为non-blocking
sample_function = function(input, fn){
let count=0;
for(let i=0; i<input.length; i++){
db.query(`SELECT * FROM DB WHERE id=?`,[input[i].id], function(error, result){
process_function(input[i], function(error, result2){
count++;
if(count===input.length){
fn(input)
}
})
})
}
}
如果整个for loop
大约需要10秒才能完成。(从数据库中读取需要5秒,而使用本地线程(process_function
处理需要5秒),则for loop
会阻塞其他新事件持续10秒钟?如果是,您如何将这个功能修复为非阻塞状态。我正在尝试学习。请帮助
答案 0 :(得分:2)
For循环已同步,但for循环内部db.query未同步。 因此在for循环中,每个查询将按一个顺序触发,但其输出不会按顺序出现。
但是您可以使用async和await解决此问题。它可以使您的代码在内部循环同步。
sample_function = async function(input, fn){
let count=0;
for(let i=0; i<input.length; i++){
const query_data = await db.query(`SELECT * FROM DB WHERE id=?,
[input[i].id]);
const process_data = await process_function(input[i]);
count++;
if(count===input.length){
fn(input)
}
}
}