基于套接字数据的NodeJS循环

nxagd54h  于 2023-10-17  发布在  Node.js
关注(0)|答案(1)|浏览(88)

我正在尝试使用套接字终止node.js中的长循环。
我使用socket.emit('eventName')从react中发出一个事件,服务器上有一个socket.on('eventName'),它最终会更新一个布尔标志并终止运行循环。
但是当我发出一个事件时,事件发出但不会在服务器端反射,因为循环仍在运行。

for(let i = 0; i < body.length; i++){
    /**
        Long Running loop which needs to be terminated based on socket event
    **/
}

它在循环结束后终止或接受套接字的输入。但是我需要在循环执行时终止它。
[更新]

let booleanFlag = false //default value of flag

下面的函数将从socket.on('eventName')调用

function cancelAPIRequest(){
    booleanFlag = true
}

这个for循环需要被终止,并将在每次迭代时检查变量“booleanFlag”的状态。

for(let i = 0; i < body.length; i++){
    if(!booleanFlag){
        // continues loop
    }else{
        return; // terminates loop
    }
}
ghhaqwfi

ghhaqwfi1#

JavaScript引擎是单线程的,它一次执行同步循环,不给任何其他处理发生的机会,包括处理套接字事件(当然,它会在某个时候被处理,但是 * 在 * 同步循环结束之后)。
为了给你的事件给予一个机会来改变你的标志值,并且后者在循环中被拾取,你需要定期“暂停”那个循环,通常是通过引入一个dec操作,例如:

// Inside an async function
async function someFunction() {
  for (let i = 0; i < body.length; i++) {
    await sleep(); // async step to enable other processing to occur
    if (!booleanFlag){ // flag may be updated externally during the sleep
        // continues loop
    } else {
        return; // terminates loop
    }
  }
}

function sleep(delayInMs = 0) {
  return new Promise((resolve) => {
    setTimeout(resolve, delayInMs);
  });
}

相关问题