Javascript 如何防止Nestjs上的事件循环冻结?

Javascript 如何防止Nestjs上的事件循环冻结?,javascript,node.js,asynchronous,nestjs,Javascript,Node.js,Asynchronous,Nestjs,我正在尝试在NestJs中创建异步任务。我希望在向某个控制器发出一个请求后,我的异步任务开始执行长任务while loop,然后节点/嵌套进程能够响应其他控制器的其他请求 但当异步循环开始时,嵌套的所有其他端点都将被冻结,直到反异步任务完成 我已经尝试使用setTimeout(),setInterval(),setintermediate(),queueMicrotask()和Promise.resolve() 我的代码: // Async task: private checkTime(ba

我正在尝试在NestJs中创建异步任务。我希望在向某个控制器发出一个请求后,我的异步任务开始执行长任务while loop,然后节点/嵌套进程能够响应其他控制器的其他请求

但当异步循环开始时,嵌套的所有其他端点都将被冻结,直到反异步任务完成

我已经尝试使用
setTimeout()
setInterval()
setintermediate()
queueMicrotask()
Promise.resolve()

我的代码:

// Async task:

private checkTime(baseTime: number, startTimeStamp: number){
   while(true){
      const elapsedTime = Date.now() - startTimeStamp
      console.log(`Elapsed time: ${elapsedTime}`)
      if(elapsedTime > baseTime){
          console.log(`Time excced!`)
          break;  
      }
   }
}
我已经试过了:

queueMicrotask(()=>this.checkTime(edge.baseTime,startedTimeStamp))

setTimeout(()=>this.checkTime(edge.baseTime,startedTimeStamp),0)
使用javascript

代码段:

function* longTask(time = 1000) {
  const startTime = Date.now();
  // divides the long task into smaller chunks
  yield startTime;

 while (Date.now() - startTime < time) {
    // process(): excute a small chunk of the task
    // and yields the control back to the caller
    yield Date.now() - startTime;
  }

}

function completeLongTask(lt) {
  const val = lt.next();
  if (!val.done) {
    setTimeout(() => {
      completeLongTask(lt);
    }, 0);
  }
}

function triggerTask() {
  const lt = longTask();
  completeLongTask(lt);
}

triggerTask();

您应该能够在长时间运行的任务中使用异步函数,并且仍然能够处理其他请求<代码>while(true)非常快地消耗内存!谢谢你的回答。只需要在我的
检查时间中输入async即可?你有什么建议让我可以“看”到事情发生?就像秒表一样,沙鲁克的回答也可以奏效。你可以用承诺来“等待”某件事,直到它完成。你的长期运行操作是什么?如果是加载一个大文件,我会选择承诺。
function checkTime(baseTime, startTimeStamp) {
  const currentTimeStamp = Date.now();
  const elapsedTime = currentTimeStamp - startTimeStamp;
  console.log(`Elapsed time: ${elapsedTime}`);
  if (elapsedTime > baseTime) {
    console.log(`Time excced!`);
    return;
  } else {
    setTimeout(() => {
      checkTime(baseTime, startTimeStamp);
    });
  }
}