3

私がこれを行うとき:

$.ajax({
    url: purl,
    dataType: 'json',
    success: function(data){
        alert(data.length);
    }
});

長さのカウントでアラートが表示されます。

しかし、私がこれを行うと...

$.ajax({
    url: purl,
    dataType: 'json',
    success: function(data){
        items = data.length;
    }
});

alert(items);

長さをグローバル変数に設定すると、うまく再生したくありません。考え?

4

2 に答える 2

4

AJAX の部分はすぐには発生しません。これalertは、AJAX コールバックが の新しい値を設定する前に行われますitems

jQuery 1.5 以降$.ajax、Promises インターフェイスを実装するオブジェクトを返します。.doneそのため、コードを実行する前に promise が解決されていることを確認する必要があるときはいつでもメソッドを呼び出すことができます。

​var promise = $.ajax({/*...*/});

promise.done(function(data){
    // Only works if the promise is resolved
});

例として、遅延オブジェクトを直接作成したとします。

var promise = $.Deferred();

次に、5 秒後まで解決しないように指示しました。

setTimeout(function(){ 
    promise.resolve("Foo");
}, 5000);

documentただし、オブジェクトのクリックに応答するようにハンドラーをバインドします。

$(document).on("click", function () {
    promise.done(function(data){
        alert("Data is " + data);
    });
});

アラートを匿名関数内に配置し、promise が解決されたpromise.doneにのみ実行されるように渡していることに注意してください。

これにより、promise が解決されるまでキューが作成されます。最初の 5 秒間に 4 回クリックしても何も起こりませんが、その約束が解決されるとすぐに、4 つの警告ボックスが次々に表示されます。

promise が解決されたので、さらにクリックすると (5 秒間待機した後)、すぐにアクションが実行されます。

デモ: http://jsfiddle.net/w7swE/1/

于 2012-12-19T19:28:49.280 に答える
3

jqXHR への参照を保存します (これも promise オブジェクトのように機能します)。後でそれを使用してデータを取得できます。

var items = $.ajax({
    url: purl,
    dataType: 'json'
});

items.done(function(data){
    alert(data.length);
});

// ... somewhere else, such as in a click event
$("#someEl").click(function(){
    items.done(function(data){
        alert(data.length);
    });
});

データが必要なときはいつでも、done コールバックを追加して、itemsそのコールバック内でデータを使用します。

于 2012-12-19T19:33:10.587 に答える