jQuery推迟不工作

我正在尝试代码

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() { $('
').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/找到一个工作示例。 我究竟做错了什么?

Test不是延迟对象 ,因此它没有方法.then().when() 一个延迟对象,因此当你调用.when()时它可以工作。

你的$.ajax()调用一个延迟对象 ,所以如果你把它作为'Test.start()方法的一部分返回,你可以添加.then()回调( 参见这里的例子 ) 'Test.start() .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() { $('
').html("Results received").appendTo('body'); } function showFailDiv() { $('
').html("Results NOT 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()调用的延迟对象 。 这与原始示例稍微接近 – 例如,如果您想看到它失败,请将URL更改为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() { $('
').html("Results received").appendTo('body'); } function showFailDiv() { $('
').html("Results NOT received").appendTo('body'); } Test.start() .then(search('ashishnjain')) .then(gotresults) .then(showDiv) .fail(showFailDiv);

更新回答评论:

在您的版本11中 ,您没有告诉延迟对象失败,因此它永远不会调用.fail()回调。 要解决这个问题,请使用ajax解释,如果.fail() error:.......告诉延迟对象失败error: drf.reject – 这将运行.fail()回调。

至于你看到ShowMoreCode()直接运行的原因是, ShowMoreCode()调用是回调函数,如果你传递一个函数的字符串表示forms,如: .then(ShowDiv)一旦它.then(ShowDiv) ,回调将寻找具有该名称的函数。 如果你传递一个函数.then(someMoreCode('Ashish')) ,它将运行该函数。 尝试一下,将.then(showDiv)改为.then(showDiv) .then(showDiv())你会发现一旦代码运行,它将显示showDiv()的代码。

如果将.then(ShowMoreCode('Ashish'))更改为.then(ShowMoreCode) ,则可以从$.ajax()调用中访问返回的数据。 像这样:

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

看看这里: 工作和不工作.fail()