2013-06-05 56 views

回答

1

注:回答假设的jQuery 1.8+。在jQuery 1.8之前,jQuery的promise/deferred实现不能以这种方式工作。

.done()/.fail().then()功能之间的细微差别 - 为1.8,.then()的主要用途是应用过滤器,而.done()/.fail()简单地套用回调。区别在于.done().fail()返回相同的承诺(因此.done().done().done()简单地将更多的回调添加到您的初始承诺中),而.then()会返回从您的过滤器返回的值的新承诺(因此.then(success)会返回一个新的承诺,将用成功返回的价值)。

这种差异的演示可以在这里找到:http://jsfiddle.net/BGSacho/HsMSv/4/

所以复制相同的功能的形象,你将需要:

Deferred.then(success_a) 
     .then(success_b) 
     .then(success_c, failure); 

可悲的是,jQuery的文档是有点粗略的主题,但你可以在http://api.jquery.com/deferred.then/

看到它使用$.when()作为公认的答案也将工作,因为它会返回其拒绝新的承诺时任何被拒绝,并成功解决所有这些承诺的数据。

+0

感谢sacho,为我节省了大量时间,一个很好的答案与小提琴和所有。 – basarat

+0

这可能是你的意思(def2而不是def):http://jsfiddle.net/basarat/HsMSv/5/ – basarat

2
var jqXHR1 = $.get('/echo/json/'), 
    jqXHR2 = $.get('/echo/json/'); 

$.when(jqXHR1, jqXHR2).then(function(data1, data2){ 

    //success, do stuff with the data objects 

}, function(jqXHR, textStatus, errorThrown) { 

    //error in at least one of the requets: 
    console.log(jqXHR, textStatus, errorThrown); 

}); 

尝试切换到一个无效的网址最终在错误回调中结束。

http://jsfiddle.net/VHjzM/

+1

同意答案,只是一个小问题 - jQuery的'.when()'与那个伪javascript中的'when()'不一样 - 伪javascript具有明确的执行顺序(第一个my_promise,然后是success_a,然后是success_b ...)。 – Sacho

+0

+1给我介绍时http://api.jquery.com/jQuery.when/但它进入内部,而我更喜欢是否有像(或可能是它的默认行为?)语法''xhr1.done( xhr2).fail(/ * *当xhr失败时调用* /' – basarat

+0

您也可以使用这些.' .done'和'.fail'只是'.then(成功,失败)的快捷方式' – Sacho