2017-07-22 6 views
0

私はユーザーが処理のためにジョブをキューに入れることができるWebアプリケーションを構築しています。バックエンドログが含まれている場合がありますパブ/サブイベントを購読するときに以前のイベントを取得する

10:57: Job 101: Part 8 of 10 completed 
10:58: Job 101: Part 9 of 10 completed 
10:59: Job 100: Part 4 of 7 completed 
11:00: New Job Queued. ID will be 102 
11:01: Job 100: Part 5 of 7 completed 
11:02: Job 101: All 10 parts completed 
11:03: Job 102: started 
11:04: Job 100: Part 6 of 7 completed 
11:05: Job 102: Part 1 of 12 completed 

フロントエンドのコードは次のようになりますのEventSourceはインスタントではない購読ので

axios.post('/job').then((res)=>{ 
    var job_id = res.body // job_id will be 102 
    var source = new EventSource("/status?job_id="+job_id); 
    source.onmessage = (event)=>{ 
    updatePageWith(event.data) 
    } 
}) 

、それは最初のメッセージは、サーバーからバックされます送信されている可能性があります「パート2の12の完了」、パート1の更新がありません。特定のジョブのすべてのイベントを取得する方法を提供しないと、イベントが見逃されないようにする方法はありますか?

+0

_ "サーバーから返信される最初のメッセージは、パート2の12分の2が完了し、パート1の更新が失われている可能性があります。イベントが見つからないようにする方法はありますか?サーバー側の問題ではなく、 'EventSource'の問題ではありますか? – guest271314

+0

はい。私は失われた更新を防ぐ手段を探しています。私は下に掲載されたソリューションの問題を "解決"しましたが、私はこの問題を抱える唯一の人ではないと確信しています。 – Dave

+0

'message'イベントが' php'から最初のイベントストリームを受信しない方法が不明ですか?あなたは '$ _SERVER [" HTTP_LAST_EVENT_ID "]'を 'php'で使っていますか? – guest271314

答えて

0

私は次のように解決してしまった:

var tracking_id = require('uuid/v4')() 
var source = new EventSource("/status?tracking_id="+tracking_id) 
source.onmessage = (event)=>{ 
    updatePageWith(event.data) 
} 
axios.post('/job', { track_with: tracking_id }).then((res)=>{ 
    var job_id = res.body // job_id will be 102 
}) 

私は仕事でのEventSourceを登録し、更新を受信する前に、処理を開始しますが、のEventSourceのオブジェクトが「doesnのための機会が減少していることを小さなチャンスがあるの実現初期化するためにジョブがサーバー上に作成されるまで待ちます。

関連する問題