有人可以检查以下概念功能是否“无阻塞”

时间:2018-11-10 02:04:47

标签: node.js nonblocking

请检查以下示例函数是否为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秒钟?如果是,您如何将这个功能修复为非阻塞状态。我正在尝试学习。请帮助

1 个答案:

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