2017-02-27 1 views
0

node.js/expressアプリケーションでイベントエミッタを設定しました。このイベントは、フロントエンドのリスナーによって捕捉されます。事は、私が一度呼ばれたことを見ることができますが、エミッターは最大4回まで同じイベントを出します。さらに、一般に、イベントはリスナーによって受信され、処理されるが、時には何も起こらない。誰かが私が間違っていることについての考えを持っていますか?SSEエミッタが複数回起動し、何度かブラウザがイベントを受け取らない

バックエンド:

app.get('/getStatus', isLoggedIn, function(req, res){ 
res.writeHead(200, {'Content-Type': 'text/event-stream'}); 
progressEmitter.on('status',function(newState, job_id, fTime, jobLink){ 
    console.log('Updated state to : ' + newState + ' for job ' + job_id); 
    res.write("event: state\n"); 
    res.write(`data:${newState},${job_id},${fTime},${jobLink}\n\n`); 
    console.log(`Emitted state change data! :${newState},${job_id},${fTime},${jobLink}\n\n`); 
}); 

})。

フロントエンド:

$(document).ready(function() { 
var state = []; 
var source = new EventSource('getStatus'); 
source.addEventListener('state', function(e) { 
    state = e.data.split(','); 
    for (var ajob in jobsReceived){ 
     if (jobsReceived[ajob].id == state[1]) { 
      jobsReceived[ajob].status = state[0]; 
      jobsReceived[ajob].finished_time = state[2]; 
      console.log(state[0]); 
      if (state[0] === 'saved') jobsReceived[ajob].link = state[3]; 
      break; 
     } 
    } 
    $('#table').bootstrapTable('updateByUniqueId', { 
      id: state[1], 
      row: { 
       status: format_status(state[0]), 
       finished_time: state[2], 
       link: state[0] === 'saved'? state[3]:'' 
      } 
     }); 

}); 

答えて

0

他の問題に時間を過ごした後、私は明確な頭でそれを再検討することを決定し、最終的に解決策を得ました。誰かが同じ問題を抱えている場合は、私はここに掲載しています。

ここで何が起こるかは、progressEmitter.on()が呼び出されるたびにリスナーが追加されることです。イベントが発生すると、すべてのリスナーが実行されます。

これを解決するには、リクエストが終了したときにリスナーを削除する必要があります。これは、emitter.removeListener()を呼び出すことによって行われます。この関数が必要とするパラメータはイベント名とリスナ関数であるため、リスナ関数に名前を付ける方が簡単です。したがって、バックエンドコードは次のように変更されます。

app.get('/getStatus', isLoggedIn, function(req, res){ 
    res.writeHead(200, {'Content-Type': 'text/event-stream'}); 
    function statusEvent(newState, job_id, fTime, jobLink){ 
    console.log('Updated state to : ' + newState + ' for job ' + job_id); 
    res.write("event: state\n"); 
    res.write(`data:${newState},${job_id},${fTime},${jobLink}\n\n`); 
    console.log(`Emitted state change data!'); 
} 

    progressEmitter.on('status',statusEvent); 
    req.on('close', function(){ 
    progressEmitter.removeListener('event', statusEvent); 
    }) 
}) 
関連する問題