Javascript 当我当前的同步循环不是';没有完成

Javascript 当我当前的同步循环不是';没有完成,javascript,node.js,async-await,Javascript,Node.js,Async Await,请看下面的代码片段 async create() { ...... const parsedJSON = await bfj.parse(fs.createReadStream(file.path)); logger.info('Parsing complete! Items: ' + parsedJSON.length); // Iterating over large data for (let index = 0; index < parsedJSON.leng

请看下面的代码片段

async create() {
  ......
  const parsedJSON = await bfj.parse(fs.createReadStream(file.path));
  logger.info('Parsing complete! Items: ' + parsedJSON.length);

  // Iterating over large data
  for (let index = 0; index < parsedJSON.length; index++) {
    parsedJSON[index].report.organizationId = this.app.get('organizationId');
    await this.DatagramService.create(parsedJSON[index].report); // DB insertion
  }
}
异步创建(){ ...... const parsedJSON=await bfj.parse(fs.createReadStream(file.path)); info('解析完成!项:'+parsedJSON.length); //在大数据上迭代 for(让index=0;index 当我到达某个端点时,就会执行这个
create()
函数。如您所见,它有一个同步
for
循环。根据我对NodeJS事件循环的了解,for循环的
应该阻止事件循环。但是,当
create()
正在处理时,我可以点击其他端点并从中获得响应。虽然响应不快(850ms)

如果
for
循环是一个阻塞操作,那么NodeJS如何处理其他请求


附加请求,是否有办法知道事件循环当前处于哪个阶段?

节点js如何处理其他请求?如果在函数上使用async wait,它将不会等待create()函数完成,因此它将转到其他代码并对其进行处理,但是一旦create()函数完成,它将通知事件循环并生成函数的输出

fs.createReadStream是一个异步函数。您尝试编写
等待fs.createReadStream
。我认为它是有效的

async create() {
  ......
  const parsedJSON = bfj.parse(await fs.createReadStream(file.path));
  logger.info('Parsing complete! Items: ' + parsedJSON.length);

  // Iterating over large data
  for (let index = 0; index < parsedJSON.length; index++) {
    parsedJSON[index].report.organizationId = this.app.get('organizationId');
    await this.DatagramService.create(parsedJSON[index].report); // DB insertion
  }
}
异步创建(){ ...... const parsedJSON=bfj.parse(等待fs.createReadStream(file.path)); info('解析完成!项:'+parsedJSON.length); //在大数据上迭代 for(让index=0;index
如我在评论中所述,
wait
正在停止当前异步函数中的代码执行。
.DatagramService.create()
是一个普通的异步操作。当JS等待它完成时,它可以处理事件循环任务队列中的其他任务。当异步操作完成时,它返回到这个特定任务并继续执行代码


可以将其视为一个
承诺
,这显然是一个非阻塞操作
async/await
只是承诺的语法糖分,使其更易于使用并避免回调地狱。

除非实现某种阻塞机制,否则for循环不会执行任何阻塞。True for循环将是一个同步调用,但是没有任何东西阻止它在循环中处理的任何函数异步执行。
while(True)
是一个事件循环阻塞操作<代码>等待不是
等待
正在停止当前任务中的代码执行。但是
.DatagramService.create()
是一个普通的异步操作。当JS等待它完成时,它可以处理EL任务队列中的其他任务。当异步操作完成时,它返回到这个特定任务并继续执行代码。可以将其视为一个
承诺
,这显然是一个非阻塞操作
async/await
只是
Promises
的一种语法糖分,可以使它们更容易使用并避免回调hell@Dijkstra,node.js调用的函数可能位于多线程的DLL或共享对象库中,任何调用都可能导致多线程操作,其中结果在后台收集,然后返回给调用方,这些异步操作都可以在不破坏调用者的同步性的情况下执行。@SebastianKaczmarek想写下一个答案让我接受吗?