javascript - 如何跨多个函数处理 Promise?

标签 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);
    });   
});

最佳答案

看看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);
    });   
});

关于javascript - 如何跨多个函数处理 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36329871/

相关文章:

javascript - 导航回页面时如何自动重新执行 javascript keyup 功能?

jQuery dragtable 插件打破了可滚动的 HTML 表格布局

javascript - 关于基于错误是同步还是异步的 Javascript Promise 错误处理差异的问题 (node.js)

javascript - 如何对 Bootstrap 卡进行分页

javascript - 将 Promise 代码替换为异步代码,加上 JavaScript 中使用 map() 的 For 循环

Angular 等待不等待

javascript - 我怎样才能解析这个xml字符串呢?

javascript - td 大小影响其他行中的其他 td

javascript - 如果设置了 headers 对象,jQuery.ajax() 会多次发送请求

javascript - 类型错误状态文本 : "Internal Server Error" for a simple post "LIKE" feature in Django using Ajax