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