Javascript 如何防止Nestjs上的事件循环冻结?
我正在尝试在NestJs中创建异步任务。我希望在向某个控制器发出一个请求后,我的异步任务开始执行长任务while loop,然后节点/嵌套进程能够响应其他控制器的其他请求 但当异步循环开始时,嵌套的所有其他端点都将被冻结,直到反异步任务完成 我已经尝试使用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
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);
});
}
}