jQuery.Deferred()。然后,如何解决多个参数

所以我的API期望当特定延迟被解决时它会得到2个参数。

fn().done(function(arg1, arg2) { console.log(arg1, arg2); }).fail(function(err) { console.error(err); }); 

现在与上面的fn函数有关,它需要先等待其他一些延迟返回才能解析。

 function other() { // stubbed out to always resolve return $.Deferred().resolve().promise(); } function fn() { return other().then(function() { return [1, 2]; }); } 

但这不起作用,因为arg1将为[1, 2]arg2将是undefined 。 我无法弄清楚如何从Deferred.then()第一个成功filter函数参数返回一些内容,以便生成的管道延迟解析多个参数。

我当然可以这样做:

 function fn() { var done = $.Deferred(); other().done(function(){ done.resolve(1, 2); }).fail(function(){ done.reject.apply(done, arguments); }); return done.promise(); } 

但这并不像使用.then()那么优雅,我现在每次都需要担心负面的失败案例API,即使我知道我只是通过管道被拒绝的状态。

是的,我也可以改变fn() api以解决数组,但我真的希望有一个优雅的解决方案。

您必须调用resolve()reject()才能传递多个参数。

.then()不包括任何“ 传播 ”返回集合的机制。 它只是保持集合完整作为第一个参数。

但是,它将与已退回的Deferred或承诺相互作用。 从以“ 从jQuery 1.8开始”开头的段落 :

这些filter函数可以返回一个新值,传递给promise的.done()或.fail()回调,或者它们可以返回另一个可观察对象(Deferred,Promise等),它将传递其已解析/拒绝的状态和值承诺的回调

因此,您可以使用other()示例作为fn()的基础,以使其与另一个Deferred()保持相当简洁:

 function fn() { return other().then(function () { return $.Deferred().resolve(1, 2).promise(); }); } fn().then(function (a, b) { console.log(arguments.length, a, b); // 2 1 2 }); 

http://jsfiddle.net/cqac2/