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