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

问题描述 投票:12回答:2

因此,我的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以使用数组进行解析,但我真的希望对此有一个优雅的解决方案。

jquery deferred
2个回答
17
投票

您必须调用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
});

http://jsfiddle.net/cqac2/


0
投票

传递给的回调然后可以返回一个新的$。延迟了2个参数,如下所示:

function other() {
  // stubbed out to always resolve
  return $.Deferred().resolve().promise();
}

function fn() {
  return other().then(function() {
    return $.Deferred().resolve(1, 2).promise();
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.