如何处理多个函数中的Promise?

时间:2016-03-31 09:49:25

标签: javascript jquery promise jquery-deferred deferred

在下面的示例中,我有一个调用另一个函数的函数(实际上可以调用另一个函数或发出Ajax请求)。

该示例适用于推迟第一个函数,但我不知道如何解决它可能调用的其他函数。

我是否必须将这些延迟对象传递给其他函数,还是有更优雅的方法? (实际上,我正在使用API​​回调处理语音合成,因此示例中的基本结构不能改变太多)。

在这里小提琴 https://jsfiddle.net/macgroover/ahz46rw1/

function slowCount(numbers, deferred) {
  if (deferred) {
    this.deferred = jQuery.Deferred();
  }
  if (numbers.length) {
    var number = numbers.shift();
    log('SC:' + number);
    setTimeout(function() {
      doSomething(number);
      slowCount(numbers);
    }, 500);

    return this.deferred.promise();
  } else {
    this.deferred.resolveWith(this, ['resolveWith']);
    //this.deferred.resolve();
    return;
  }
}

function doSomething(number) {

  setTimeout(function() {
    log("DS:" + number);
  }, 1000);
}

$(function() {  
    $.when(slowCount([1, 2, 3, 4], true)).done(function(rslt) {
      log("All tasks finished with " + rslt);
    });   
});

1 个答案:

答案 0 :(得分:2)

请查看these rules - 尤其是始终promisify的最低级别,setTimeout为您:

function wait(timeout) {
    var deferred = jQuery.Deferred();
    setTimeout(deferred.resolve, timeout);
    return deferred.promise();
}

现在其余部分相当简单:

function slowCount(numbers) {
    if (numbers.length) {
        var number = numbers.shift();
        log('SC:' + number);
        return wait(500).then(function() {
            return doSomething(number);
        }).then(function() {
            return slowCount(numbers);
        });
    } else {
        return $.when("end result");
    }
}

function doSomething(number) {
    // I assume you want this to be asynchronous as well
    // - so it returns a promise!
    return wait(1000).then(function() {
        log("DS:" + number);
    });
}

$(function() {  
    slowCount([1, 2, 3, 4]).then(function(rslt) {
        log("All tasks finished with " + rslt);
    });   
});