6

私は次のようにコードを試しています

function search(query) {
    var dfr = $.Deferred();
    $.ajax({
        url: "http://search.twitter.com/search.json",
        data: {
            q: query
        },
        dataType: 'jsonp',
        success: dfr.resolve
    });
    return dfr.promise();
}

Test = {
    start: function(){
        alert("Starting");
    }
};

function gotresults(data) {
    alert(data.max_id);
}

function showDiv() {
    $('<div />').html("Results received").appendTo('body');
}

$.when(search('ashishnjain'))
    .then(gotresults)
    .then(showDiv);

これは期待どおりに機能します。しかし、私がそれを次のように書くとき:

Test.start()
    .then(search('ashishnjain'))
    .then(gotresults)
    .then(showDiv);

「開始中」と警告するだけで終了します。実際の例はhttp://jsfiddle.net/XQFyq/2/にあります。私は何が間違っているのですか?

4

1 に答える 1

8

Test遅延オブジェクトではないため、メソッドはありません.then().when() IS遅延オブジェクトであるため、 を呼び出したときに機能するのはなぜですか.when()

あなたの$.ajax()呼び出しは遅延オブジェクトであるため、メソッドの一部としてそれを返す場合は、コールバック'Test.start()を追加できます(こちらの例を参照)。コールバックは、ajax 呼び出しが解決されると、つまりデータが返されると呼び出されますが、これはそうではありません。遅延オブジェクトの正しい使い方ではないと思います。以下は、私が信じている使用方法の詳細です。.then().then()

function searchTwitter(query){
    $.ajax({
            url: "http://search.twitter.com/search.json",
            data: {
                q: query
            },
            dataType: 'jsonp',
            success: function(data){return data;}
        })
        .then(gotresults)
        .then(showDiv)
        .fail(showFailDiv);
};

function gotresults(data) {
    alert(data.max_id);
}

function showDiv() {
    $('<div />').html("Results received").appendTo('body');
}

function showFailDiv() {
    $('<div />').html("Results <b>NOT</b> received").appendTo('body');
}

// Starting can be done with a click:

$("#searchTwitter").click(function(){
   searchTwitter($("#searchName").val()); 
});

// OR a static call:
searchTwitter("ashishnjain");

ここで動作するのを見てください

たとえば、返されたデータが必要な場合は、.....showDiv()に変更します。showDiv(data)


呼び出しの遅延オブジェクトに依存する代わりに、独自の遅延オブジェクトを作成する方法の別の例を次に示します。これは元の例に少し近いです。たとえば、失敗するのを確認したい場合は、URL を次の例に変更します.ajax()http://DONTsearch.twitter.com/search.json

var dfr;

function search(query) {
    $.ajax({
        url: "http://search.twitter.com/search.json",
        data: {
            q: query
        },
        dataType: 'jsonp',
        success: function(data){dfr.resolve(data);},
        error:  function(){dfr.reject();}
    });
}

Test = {
    start: function(){
        dfr = $.Deferred();
        alert("Starting");
        return dfr.promise();        
    }
};


function gotresults(data) {
    alert(data.max_id);
}

function showDiv() {
    $('<div />').html("Results received").appendTo('body');
}

function showFailDiv() {
    $('<div />').html("Results <b>NOT</b> received").appendTo('body');
}

Test.start()
    .then(search('ashishnjain'))
    .then(gotresults)
    .then(showDiv)
    .fail(showFailDiv);

コメントに答えるために更新します。

バージョン 11では、遅延オブジェクトに失敗を伝えていないため、コールバックが呼び出されることはありません.fail()。これを修正するには、.fail() ( error:.......)の場合は ajax 解釈を使用して、遅延オブジェクトに失敗を通知します。これにより、コールバックerror: drf.rejectが実行されます。.fail()

ShowMoreCode()すぐに実行される理由としては、.then()次のような関数の文字列表現を渡すと、呼び出しはコールバックです。.then(ShowDiv)順番が来ると、コールバックはその名前の関数を探します。関数に呼び出しを渡すと、関数.then(someMoreCode('Ashish'))が実行されます。試してみてください。変更.then(showDiv)する.then(showDiv())と、コードが実行されるとすぐに気付くでしょう。 からのコードが表示されshowDiv()ます。

に変更.then(ShowMoreCode('Ashish'))すると、呼び出し.then(ShowMoreCode)から返されたデータにアクセスできます。$.ajax()このような:

function someMoreCode(name) {
    alert('Hello ' + name.query);
}

ここを見てください:働いている、働いていない.fail()

于 2011-02-12T20:20:50.983 に答える