如何跨多个函数处理Promise

How do I handle Promises across multiple functions?

本文关键字:处理 Promise 函数 何跨多      更新时间:2023-10-15

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

这个例子适用于延迟第一个函数,但我不知道如何使它解析它可能调用的其他函数。

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

Fiddle herehttps://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);
    });   
});

看看这些规则-尤其是,始终在最低级别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);
    });   
});