Test
不是延迟对象,所以它没有方法.then()
。.when()
是一个延迟对象,因此为什么它在您调用.when()
.
您的$.ajax()
调用是一个延迟对象,因此如果您将其作为'Test.start()
方法的一部分返回,则可以添加.then()
回调(请参见此处的示例),.then()
一旦 ajax 调用被解决,即返回其数据,回调将被调用,但是这是我不认为延迟对象的正确使用。以下是我相信的更多使用方式:
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)
.....
这是另一个示例,说明如何创建自己的延迟对象而不是依赖调用的延迟对象.ajax()
。这更接近您的原始示例 - 例如,如果您想看到它失败,请在http://DONTsearch.twitter.com/search.json
此处将 url 更改为示例:
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()
回调。要纠正这个问题,请使用 ajax 解释如果.fail()
( error:.......
)通知延迟对象失败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()