【发布时间】:2014-07-11 18:08:21
【问题描述】:
所以我的 API 期望当一个特定的延迟被解决时,它会获得 2 个参数。
fn().done(function(arg1, arg2) {
console.log(arg1, arg2);
}).fail(function(err) {
console.error(err);
});
现在涉及到上面的fn函数,它需要先等待其他一些deferred返回才能解析。
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带2个参数才是正确的传递方式。 -
@TrueBlueAussie 所以我猜你是说答案是没有办法使用
then()函数做我想做的事? -
你可以返回一个具有多个属性的匿名对象,这比数组略好?例如
return {one: 1, two: 2}; -
@TrueBlueAussie 感谢您的建议,我想我将更改我的 API 以期望这样的对象,因为我讨厌必须处理完成/拒绝状态,我更喜欢使用 @ 987654335@模式