因此,我的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()
第一个成功过滤器函数参数中返回某些内容,以使最终的管道延迟解析具有多个参数。
我当然可以这样做:
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()
不包含用于“ spreading”返回集合的任何机制。它只是将集合作为第一个参数完整保留。
但是,它将与Deferred
进行交互或返回所承诺的内容。从paragraph starting with "As of jQuery 1.8":
这些过滤器函数可以返回要传递给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
});
传递给的回调然后可以返回一个新的$。延迟了2个参数,如下所示:
function other() {
// stubbed out to always resolve
return $.Deferred().resolve().promise();
}
function fn() {
return other().then(function() {
return $.Deferred().resolve(1, 2).promise();
});
}