2017-10-16 44 views
0

我的问题似乎是服务器正在监听某个事件的WebSocket,然后当某个事件被听到时,它应该通过一个不同的WebSocket来触发它自己的事件,但该事件很少被触发。随着函数availabilityCheck中的条件语句被移除,事件总是被激发而不是很少。为了清楚起见,服务器连接了2个套接字Web套接字。 (2)Socket io不会因if语句触发事件,可能是竞态条件?

从websocket(1)听到的事件通常在毫秒内2-4次 - >后端执行逻辑(但只有一次事件,尽管事件被触发2-4次) - >事件应该触发websocket(2)

let obj = {available: 0} 

if (event.Event == 'AgentConnect') { 
    const agentExtension = '1001' 
    availabilityCheck(event, agentExtension) 
    .then(function() { 
     socket.emit('AgentConnect', agentExtension); //works rarely, but always works when the if statement inside availabilityCheck() is removed 
    }).catch(function(err){ 
     console.log(err); 
     }) 
    }// end if 




function availabilityCheck(evt, agentExt) { 
    return promise = new Promise(function (resolve, reject) { 
     if (obj.available == 0) {// When this conditional is removed the socket event always fires 
      obj.available =1; 
      resolve(); 
     } else { 
      reject('agent unavailable'); 
     } 
    }) 
} 
+0

其中obj来自哪里? – Cruiser

+0

没有真正的相关性,但为了清晰起见,我在顶部添加了它 – HarrisonSchultz

回答

0

你能尝试以下方法:

var obj = (x =>{ 
    var available = 0; 
    return { 
     set available(val) { 
     debugger; 
     available=val; 
     }, 
     get available() { 
     return available; 
     } 
    } 
})(); 

现在应该暂停,当您更改可用,如果你有开发者工具打开(按F12),你可以检查堆栈跟踪,看看有什么其他的代码在Promise正在解决时正在改变。

您提供的代码不会显示任何问题,可用的应该仍然是0,但我确定有更多的代码。

如果你想要的东西在意甲发生,那么你可以运行在意甲的承诺,而不是并行:

let agentConnectPromise = Promise.resolve() 

if (event.Event == 'AgentConnect') { 
    agentConnectPromise = 
    agentConnectPromise 
    .then(
    x=> availabilityCheck(event, agentExtension) 
) 
    .then(... 
+0

我应该已经更清楚了。我的代码试图写入obj.available,同时也尝试读取obj.available,因为availabilityCheck正在异步运行多次。然后由于那个socket.emit('AgentConnect',agentExtension);没有做任何事情。 – HarrisonSchultz

+0

@HarrisonSchultz所以在某些时候你把可用的设置回0?如果你不想在同一时间运行异步进程,你可以通过序列化来更好地完成这个任务(参见更新后的答案)。 – HMR

+0

谢谢。你的建议帮助我找到了解决方案!我需要在读完它的函数之后分配变量。 – HarrisonSchultz

0

的obj.available分配移动到那么()固定我的问题。

if (event.Event == 'AgentConnect') { 
const agentExtension = '1001' 
availabilityCheck(event, agentExtension) 
.then(function() { 
obj.available = 1; //moved from availability to check to here. 
    socket.emit('AgentConnect', agentExtension); //works rarely, but always works when the if statement inside availabilityCheck() is removed 
}).catch(function(err){ 
    console.log(err); 
    }) 
}// end if