2016-11-26 7 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メッセージによって変数にアクセスすると、コールバックの実行が終了するまで待つ(a.k.a.イベントキューに入る)。

これが問題に特に関連ではないかもしれませんが、あなたはJSとエンジンの内部のシステムを扱うイベントについてもう少し学ぶことに興味を持っているならば、私はこの話はかなり良いが見つかりました:https://youtu.be/8aGhZQkoFbQ

関連する問題