有人可以检查以下概念函数是否是“非阻塞”的
can someone check if the following conceptual function is `non-blocking`
请检查以下示例函数是否为 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 秒,使用本地线程处理 5 秒 (process_function
),for loop
block other new events for 10 seconds? 如果是这样,你将如何修复这个功能是非阻塞的。我正在努力学习。请帮助
for 循环是同步的,但是 for 循环内部 db.query 是不同步的。
所以在for循环中,每个查询都会一个接一个地触发,但它们的输出不会按顺序出现。
但是你可以用 async 和 await 来解决这个问题。它可以使你的for循环内的代码同步。
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)
}
}
}
请检查以下示例函数是否为 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 秒,使用本地线程处理 5 秒 (process_function
),for loop
block other new events for 10 seconds? 如果是这样,你将如何修复这个功能是非阻塞的。我正在努力学习。请帮助
for 循环是同步的,但是 for 循环内部 db.query 是不同步的。 所以在for循环中,每个查询都会一个接一个地触发,但它们的输出不会按顺序出现。
但是你可以用 async 和 await 来解决这个问题。它可以使你的for循环内的代码同步。
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)
}
}
}