2016-11-26 81 views
0

我通過下面的函數callRestApi接收來自休息API的數據。但是,我收到通過websocket收到的其他數據的更新,我想確保我不會錯過任何內容。因此,我在調用其餘端點之前開始緩衝websocket事件。在收到剩餘響應後,我會調度緩衝的事件並開始分配隨後收到的任何新內容,並更新我的數據副本。但是,我是否正確實施了這個?特別是,我可能會錯過函數startDispatchingEvents中的一個事件,我將這個事件分配給ws.onmessage一個新值。我正在使用redux調度程序。如果我重新分配ws.onmessage,我可以錯過web套接字事件嗎?

export const startBufferingEvents =() => { 
    eventBuffer = []; 
    ws.onmessage = msg => { 
     eventBuffer.push(msg); 
    } 
}; 

export const startDispatchingEvents = (dispatcher) => { 
    eventBuffer.forEach(evt => dispatcher(evt)); 
    ws.onmessage = evt => dispatcher(evt); 
}; 


startEventBuffering() 
    .then(()=>callRestApi()) 
    .then(restResponse=>dispatch(action(restResponse))) 
    .then(()=>startDispatchingEvents((evt)=>eventDispatcher(dispatch, evt))) 
}; 

回答

1

它應該不是問題。所有在JavaScript中執行的代碼(假設您在瀏覽器中運行該代碼)都是單線程的。這意味着您不能遇到競爭條件或任何其他併發問題。當執行代替onmessage的值的回調時,通過例如websocket消息訪問變量將等待(也就是進入事件隊列),直到回調執行結束。

這可能不是特別相關的問題,但如果你有興趣瞭解更多的有關該事件的處理JS的系統和發動機的內部,我發現這個談話相當好:https://youtu.be/8aGhZQkoFbQ

相關問題