0

私の機能はそのように見えます

var mail_ntfy=$("#nav_mail"), question_ntfy=$("#nav_question"), users_ntfy=$("#nav_users");
function CheckAll(){
    var data=checkFor("m,q,u");
    if(mail_ntfy.attr("data-number")!=data.m_count && data.m_count!=0)
        mail_ntfy.attr("data-number", data.m_count);
    if(question_ntfy.attr("data-number")!=data.q_count && data.q_count!=0)
        question_ntfy.attr("data-number", data.q_count);
    if(users_ntfy.attr("data-number")!=data.u_count && data.u_count!=0)
        users_ntfy.attr("data-number", data.u-count);
    showNotes(data.msg);
    chngTitle(data.msg);    
}

$(document).ready(function () {
    setInterval(CheckAll(), 10000);
})

function checkFor(param){    
    $.ajax({
        url: "core/notifications.php",
        type: "POST",
        dataType: "json",
        data: {
            chk:param
        },
        success: function (data) { 
            if(data.status!="error")  {
                console.log(data);
                return data;                
            }

        }
    });
}

2 つの質問があります。

1)checkFor関数が結果を返す(console.logに結果が表示される)ことがわかりますが、まだデータを取得していないというエラーメッセージが行に表示されますif(mail_ntfy.attr("data-number")!=data.m_count && data.m_count!=0)。私は何が欠けていますか?

CheckAll2) 10 秒ごとに実行したい。しかし、それは1回以上開始されません。setinterval が正しく機能しないのはなぜですか?

4

4 に答える 4

1

AJAX 呼び出しcheckForを返す場合は、同期する必要があります。dataただし、これは Javascript の不適切な使用方法です (たとえば、リクエストが完了するまで、ページでのスクリプトの実行が停止します)。残念ながら、この設計全体に欠陥がありますが、本当に必要な場合は、このコードを使用できます。

function checkFor(param){    
  var result;
  $.ajax({
    url: "core/notifications.php",
    type: "POST",
    async: false,
    dataType: "json",
    data: {
        chk:param
    },
    success: function (data) { 
        if(data.status!="error")  {
            console.log(data);
            result = data;                
        }

    }
  });
  return result;
}
于 2012-06-04T21:16:08.090 に答える
1

コールバックからデータを返すことはできませんsuccessCheckAll代わりに、このような成功コールバックから呼び出すことができます

success: function (data) { 
            if(data.status!="error")  {
                console.log(data);
                //return data;                
                CheckAll(data);
            }

        }

代わりに 10 秒ごとに実行するcheckForには、成功コールバック内からタイマーを設定することもできます。checkForこれにより、 ajax リクエストが成功するたびに 10 秒が呼び出されます。使用setIntervalすると、複数の同時 ajax 呼び出しが発生する可能性があります。

success: function (data) { 
                if(data.status!="error")  {
                    console.log(data);
                    //return data;                
                    CheckAll(data);
                    setTimeout(checkFor,10000);
                }

            }

そして、あなたの更新checkAllは次のようになります

function CheckAll(data){

    if(mail_ntfy.attr("data-number")!=data.m_count && data.m_count!=0)
        mail_ntfy.attr("data-number", data.m_count);
    if(question_ntfy.attr("data-number")!=data.q_count && data.q_count!=0)
        question_ntfy.attr("data-number", data.q_count);
    if(users_ntfy.attr("data-number")!=data.u_count && data.u_count!=0)
        users_ntfy.attr("data-number", data.u-count);
    showNotes(data.msg);
    chngTitle(data.msg);    
}
于 2012-06-04T21:11:54.340 に答える
1

checkFor()結果を返しません。ステートメントは、AJAX 要求console.log()のハンドラーにアタッチされた無名関数にあります。successその return は関数から戻りませcheckFor()

于 2012-06-04T21:12:57.997 に答える
0

Ajax を非同期で呼び出しているため、システムは処理を続行するために ajax が終了するのを待ちません。追加する必要があります

async:false, 

次のように、あなたのajax呼び出しに:

function checkFor(param){    
    $.ajax({
        url: "core/notifications.php",
        type: "POST",
        async:false,
        dataType: "json",
        data: {
            chk:param
        },
        success: function (data) { 
            if(data.status!="error")  {
                console.log(data);
               var ret=data;                
            }

        }
    });
return ret;
}

それが役に立てば幸い!

于 2012-06-04T21:16:15.257 に答える