Как предотвратить зависание события l oop на Nest js? - PullRequest
1 голос
/ 17 июня 2020

Я пытаюсь создать асинхронную задачу в Nest Js. Я хочу, чтобы после того, как был сделан один запрос к какому-либо контроллеру, моя задача asyn c запускала вашу долгую работу, пока l oop, а затем процесс node / nest мог отвечать на другие запросы других контроллеров.

Но когда начинается asyn c l oop, все остальные конечные точки Nest зависают до тех пор, пока не будет выполнена задача asyn c.

Я уже пытался использовать setTimeout(), setInterval(), setIntermmediate(), 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)

1 Ответ

1 голос
/ 17 июня 2020

Используйте 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();

Хотя приведенное выше решение работает, я думаю, вам не нужно использовать генераторы для ваш вариант использования. Посмотрите, подойдет ли вам это более простое решение.

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