2010-02-03 2 views
0

내 응용 프로그램 내가 웹 서비스 기능 RetrieveMessages() 초마다 호출 클라이언트 타이머가 C# 및 ASP.NETJavascript 함수가 두 번 호출되었지만이를 처리하는 방법은 무엇입니까?

에서 개발 한 LIVECHAT이다. 또한 사용자가 메시지를 보낸 직후 동일한 함수 RetrieveMessages()를 호출합니다.

마지막 메시지 ID를 저장하는 변수가 있기 때문에 모든 RetrieveMessage 호출은 읽지 않은 메시지 만 검색합니다.

는 때때로 클라이언트는과 같이, 두 번 같은 메시지를 보여

에베 톤 (14시 22분 20초 일) : 안녕하세요! 에버 튼 (14:22:20) : 안녕하세요.

중복성은 클라이언트에서만 발생하며, 데이터베이스 테이블은 정상이며 중복되지 않습니다.

나는 Timer가 의심스럽고, 변수 lastMessageId가 업데이트되기 전에 Send Message가 RetrieveMessage를 실행하고 있습니다.

어떻게 RetrieveMessage() 호출을 동기화 할 수 있습니까?

다음은 분석 할 코드입니다.

// ThisFunction is a callback that RetrieveMessage every time the user send's a message 
function SendMessageSucess(cdMsgEnviada) { 
    //Carrega Mensagens 
    Avalon.Services.ChatService.RetrieveMessages(CodChamado, IdLastMsg, RetrieveMessagesSucess); 
} 

OnTImer 틱

// Every second, verify is exist new messages 
function timer_onTick() { 
    //Carrega Mensagens 
    Avalon.Services.ChatService.RetrieveMessages(CodChamado, IdLastMsg, RetrieveMessagesSucess); 
} 

RetrieveMessages 기능

function RetrieveMessagesSucess(result) { 
    var myMsgs = new Array(); 
    for (var i = 0; i < result.length; i++) { 
     var obj = eval('(' + result[i] + ')'); 
     if (obj != null) 
      myMsgs[i] = obj; 
    } 

    for (var j = 0; j < myMsgs.length; j++) { 
     if (myMsgs.length > 0) { 
      // Armazeno o codigo da ultima mensagem recebida 
      IdLastMsg = myMsgs[myMsgs.length - 1].cd_chat_message; 

      if (par) { 
       var novoconteudo = "<div style='background-color: #EFEFEF; padding: 10px;'>" 
       par = false; 
      } 
      else { 
       var novoconteudo = "<div style='padding: 10px;'>" 
       par = true; 
      } 

      if (myMsgs[j].origem_mensagem == 1) // Msg enviada pelo cliente 
       novoconteudo = novoconteudo + "<b>" + myMsgs[j].solicitante + ": </b>" 
      else 
       novoconteudo = novoconteudo + "<b>" + myMsgs[j].tecnico + ": </b>" 

      var objDate = eval(myMsgs[j].datahora.replace(/\/Date\((\d+)\)\//gi, "new Date($1)")); 

      novoconteudo = novoconteudo + "(" + objDate.format("HH:MM:ss") + ") "; 

      novoconteudo = novoconteudo + myMsgs[j].texto + "</div>"; 

      divChatHistory.append(novoconteudo); 

      AutoScroll(); 

      if (myMsgs[j].origem_mensagem == 2) // Msg enviada por um tecnico 
       show_popAlert() 
     } 
    } 
    // Verifico se o chat esta ativo 
    IsChatInativo(); 
} 

어떤 아이디어가?

+0

변명 내 나쁜 영어 = O). 이것은 잘 확장되지 않습니다. – cgp

답변

0

개체 인 전역 변수를 설정하고 대화에 새 메시지를 추가 할 때마다 새 속성을 만듭니다. 새 속성의 이름에 메시지 ID를 사용하고이를 true 또는 다른 것으로 설정하십시오. 각 메시지에 고유 한 ID가있는 경우 계속 진행하기 전에 해당 메시지의 특정 속성이 개체에 있는지 확인하여 해당 메시지를 아직 처리하지 않았는지 확인할 수 있습니다.

for (var j = 0; j < myMsgs.length; j++) { 
    if (myMsgs.length > 0) { 
     thisMsgId = myMsgs[j].id; 
     if(PROCESSED_MSGS['msg'+thisMsgId]) continue; 
     PROCESSED_MSGS['msg'+thisMsgId] = true; 
     //keep going.... 
+0

안녕하세요 Jage, 당신의 솔루션이 좋아 보인다.오늘 나는 이것을 구현할 것이고, 곧 나는 당신에게 피드백을 줄 것이다. 당신의 대답에 감사드립니다. – Ewerton

1

틱 메서드를 입력 할 때 타이머를 비활성화하고 메서드를 종료하기 전에 타이머를 다시 활성화하십시오.

+0

안녕하세요 카를로스, 귀하의 anwser 주셔서 감사합니다, 나는 그것을 시도합니다 – Ewerton

0

Jage이 솔루션은 잘 작동 ... 그리고 나중에

var PROCESSED_MSGS = new Object(); 

과 :

은 같을 수 있습니다.

function RetrieveMessagesSucess(result) { 
    // parsin the json and storing the messages in a array 
    var myMsgs = new Array(); 
    for (var i = 0; i < result.length; i++) { 
     var obj = eval('(' + result[i] + ')'); 
     if (obj != null) 
      myMsgs[i] = obj; 
    } 


    for (var j = 0; j < myMsgs.length; j++) { 
     if (myMsgs.length > 0) { 

      // Verifing if the message already exists 
      var divExiste = document.getElementById(myMsgs[j].cd_chat_message); 

      // If not exists, put the message on the page 
      if (divExiste == null) { 

       // Storing the id of tha last received message. This is useful as a parameter to retrieve messages again 
       IdLastMsg = myMsgs[myMsgs.length - 1].cd_chat_message; 

       // Trick to a zebra style 
       if (par) { 
        var novoconteudo = "<div id='" + myMsgs[j].cd_chat_message + "' style='background-color: #EFEFEF; padding: 10px;'>" 
        par = false; 
       } 
       else { 
        var novoconteudo = "<div id='" + myMsgs[j].cd_chat_message + "' style='padding: 10px;'>" 
        par = true; 
       } 

       // Putting the message on page 
       if (myMsgs[j].origem_mensagem == 1) // Msg enviada pelo cliente 
        novoconteudo = novoconteudo + "<b>" + myMsgs[j].solicitante + ": </b>" 
       else 
        novoconteudo = novoconteudo + "<b>" + myMsgs[j].tecnico + ": </b>" 

       var objDate = eval(myMsgs[j].datahora.replace(/\/Date\((\d+)\)\//gi, "new Date($1)")); 
       novoconteudo = novoconteudo + "(" + objDate.format("HH:MM:ss") + ") "; 
       novoconteudo = novoconteudo + myMsgs[j].texto + "</div>"; 
       divChatHistory.append(novoconteudo); 
       AutoScroll(); 

       if (myMsgs[j].origem_mensagem == 2) // Msg enviada por um tecnico 
        show_popAlert() 
      } 
     } 
    } 
    IsChatInativo(); 
} 

그게 전부 너희들 : 나는 RetrieveMessages 에 약간의 적응이 코드를 볼 수 있습니다 않습니다.

고맙습니다. 당신은 아마 이러한 유형의 거래에 대한 혜성의 일부 양식을 사용한다

+0

좋은 일도 있습니다. 고마워요. – Jage

관련 문제