有人可以检查以下概念函数是否是“非阻塞”的

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)
        }
    }
}