0

$.ajax() からデータを取得する単純な呼び出しを実行しようとしており、ajax 呼び出しを呼び出した関数で使用できるグローバル変数に保存したいと考えています。

変数が設定されていないのはなぜですか? 設定した値が失われるのはなぜですか?

jQuery.support.cors = true;

$.myNamespace = {
    timerID: "in namespace"
};

$(document).ready(function () {
    $("#btnSkip").click(function () {
        alert($.myNamespace.timerID);
        startCall();
    });

    function startCall() {
        $.myNamespace.timerID = "in startCall()";
        alert($.myNamespace.timerID);
        finishCall();
        alert($.myNamespace.timerID);
    }

    function finishCall() {
        $.myNamespace.timerID = "in finishCall()";
        alert($.myNamespace.timerID);

        $.ajax({
            type: "GET",
            url: getUrl,
            processData: false,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (data) {
                $.myNamespace.timerID = "in ajax succeeded call";
                alert($.myNamespace.timerID);
            },
            error: function (xhr, status, error) {
                GetSongInfoFailed(xhr, status, error);
            }
        });
    }

    function GetSongInfoFailed(xhr, status, error) {
        alert('Service call failed: ' + xhr + ' ' + status + ' ' + error);
    }


});

alert()上記のコードの sからの出力:

  1. in namespace
  2. in startCall()
  3. in finishCall()
  4. in ajax succeeded call
  5. in finishCall()

最後の変数が「in ajax successfully call」ではなく「in finishCall()」に設定されるのはなぜですか?

私は jQuery や JavaScript の専門家ではないことに注意してください。

どうもありがとう!

4

3 に答える 3

0

これはデータの保存の問題ではなく、実際には実行順序の問題です。コードをもう一度確認してみましょう。今度は、finishCall() 呼び出しを関数の実際のコードに置き換えます。

alert($.myNamespace.timerID);

$.myNamespace.timerID = "in finishCall()";
alert($.myNamespace.timerID);

$.ajax({..., ..., function() {     
  $.myNamespace.timerID = "in ajax succeeded call()";
  alert($.myNamespace.timerID);
});

alert($.myNamespace.timerID);

JS は $.ajax の呼び出しが成功するのを待たずに、最後の .ajax を呼び出しますalert。その場合、値は still になりますin finishCall()

私を困惑させているのはalert、あなたが言うように、これが最後の前のものではなく、最後に表示される理由です。console.log「ajax success call」を使用すると、実際には最後に表示されます。

于 2012-07-09T22:54:03.473 に答える
0

したがって、データを受信したら機能します。と呼ばれます:

GetSongInfoSucceeded(data);

関数定義を見ると、次のようになります。

function GetSongInfoSucceeded(C) {

次に、「データ」の入力が と呼ばれる var 内にあることがわかりますC。そのため、呼び出しresultても答えが得られません。

        if (result != null) {

            $.myNamespace.timerID = "in ajax succeeded call";
            alert($.myNamespace.timerID);

        } else { }

正しい方法は次のようになります。

function GetSongInfoSucceeded(result) {
    if (result != null) {
        $.myNamespace.timerID = "in ajax succeeded call";
        alert($.myNamespace.timerID);
    } else { }
}
于 2012-07-09T22:38:30.167 に答える
0

あなたの成功のコールバック関数

 function GetSongInfoSucceeded(C) {
        if (result != null) {

            $.myNamespace.timerID = "in ajax succeeded call";
            alert($.myNamespace.timerID);

        } else { }

    }

関数が入力データとして取得する無効なrequest変数がありますC

于 2012-07-09T22:37:52.763 に答える