2011-02-12 156 views
6

我尝试了代码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() { 
    $('<div />').html("Results received").appendTo('body'); 
} 

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

可正常工作。然而,当我把它写成:

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

它只是提醒“启动”和terminates.A工作示例可以在http://jsfiddle.net/XQFyq/2/找到。我究竟做错了什么?

+0

'开始(),所以你不能使用链接在这里我想`不返回任何东西。 – pimvdb 2011-02-12 16:58:17

+0

即使把搜索放在测试中并从搜索开始并没有帮助。 – Ashish 2011-02-12 17:03:14

回答

7

Test不是deferred object,所以它没有方法.then().when()IS a deferred object因此,当您拨打.when()时,它会工作。

$.ajax()呼叫IS一个deferred object,因此,如果您返回,作为您'Test.start()方法的一部分,您可以添加.then()回调see example here,一旦Ajax调用已经解决了.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"); 

看到它的工作here

如果你想在例如showDiv()其更改为showDiv(data)返回的数据... ..


这是另一个如何创建自己的deferred object而不是依靠致电.ajax()致电。这是一个有点接近你原来的例子 - 如果你想看到它失败例如,将URL更改为http://DONTsearch.twitter.com/search.jsonexample here

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

更新回答的评论:

在您的version 11中,您没有告诉延迟的失败对象,因此它永远不会调用.fail()回调。要纠正这种情况,如果.fail()error:.......建议延迟对象的失败error: drf.reject - 这将运行.fail()回调,请使用ajax解释。

至于你看到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); 
} 

到这里看看:workingNOT working .fail()