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

时间:2014-07-11 18:08:22

标签: 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()第一个成功过滤器函数参数返回一些内容,以便生成的管道延迟解析为多个参数。

当然我可以这样做:

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以解决数组,但我真的希望有一个优雅的解决方案。

3 个答案:

答案 0 :(得分:17)

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

.then()不包含" 传播"的任何机制。退回的集合。它只是保持集合完整,作为第一个参数。

但是,它会与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/

答案 1 :(得分:0)

传递给的回调可以返回一个新的$ .Deferred带有2个这样的参数:

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

function fn() {
  return other().then(function() {
    return $.Deferred().resolve(1, 2).promise();
  });
}

答案 2 :(得分:0)

使用ES6,您可以在public static void main (String[ ] args) { Scanner input = new Scanner(System.in); System.out.print("Enter month number. [1..12] --> "); int month = input.nextInt(); String MonthString; switch (month) { case 1 : MonthString = "ZS"; break; case 2 : MonthString = "CN"; break; case 3 : MonthString = "YH"; break; case 4 : MonthString = "MT"; break; case 5 : MonthString = "CL"; break; case 6 : MonthString = "SS"; break; case 7 : MonthString = "WM"; break; case 8 : MonthString = "WY"; break; case 9 : MonthString = "SH"; break; case 10 : MonthString = "YJ"; break; case 11 : MonthString = "XG"; break; case 12 : MonthString = "HZ"; break; default : System.out.print("This is not a valid month number."); } System.out.println(MonthString);/*This is where it won't compile*/ } 中使用散布运算符传递可变数量的参数,并使用$.when()链接成功函数

.done(//syntax)