代码之家  ›  专栏  ›  技术社区  ›  Ewerton

Javascript函数调用两次,如何处理?

  •  0
  • Ewerton  · 技术社区  · 16 年前

    我有一个客户端计时器,它每秒调用webservice函数RetrieveMessages()。 此外,在用户发送消息后不久,我将调用de same函数RetrieveMessages()。

    我有一个存储最后一个消息Id的变量,因此,每个RetrieveMessage调用只检索未读的消息。

    埃沃顿(14:22:20):你好!

    重复性只发生在客户端,数据库表正常,没有重复。

    我怀疑是计时器,发送消息在更新变量lastMessageId之前正在执行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);
    }
    

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

    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();
    }
    

    有什么想法吗?

    3 回复  |  直到 16 年前
        1
  •  0
  •   Jage    16 年前

    设置作为对象的全局变量,并在每次向对话添加新消息时在其中创建新属性。在新属性的名称中使用消息ID,并将其设置为true或其他值。如果您的每条消息都有一个唯一的ID,那么您可以通过检查对象中是否存在该消息ID的特定属性来验证您在继续之前是否尚未处理该消息。

    可能看起来像:

    var PROCESSED_MSGS = new Object();
    

    然后后来。。。

    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....
    
        2
  •  1
  •   CARLOS LOTH    16 年前

        3
  •  0
  •   Ewerton    16 年前

    Jage,你的解决方案很好用。我在RetrieveMessages中做了一些修改 让我们看看代码:

        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();
    }
    

    就是这样,伙计们。

    请原谅我的英语不好