检测异步调用是否完成,然后触发另一个函数?

时间:2018-02-09 21:13:16

标签: javascript jquery asynchronous jquery-deferred

检测所有异步调用何时完成然后触发另一个函数的最佳方法是什么?我有三个查询是由用户选择主题触发的。这些查询运行,然后将它们的返回值组合起来用于新函数。问题是我需要知道什么时候完成它们然后运行新函数。

function queryHandler1() {
    // do something
    return result1;
}

function queryHandler2() {
    // do something
    return result2;
}

function queryHandler3() {
    // do something
    return result3;
}

function alldone(result1, result2, result3) {
     // do something
    return result4;
}

我尝试过使用jquery.when(),但它只在第一次运行时,当用户选择一个新选项时,它不会触发alldone?

// global
var d1 = $.Deferred();
var d2 = $.Deferred();
var d3 = $.Deferred();

function queryHandler1() {
    // do something
    d1.resolve();
    return result1;
}

function queryHandler2() {
    // do something
    d2.resolve();
    return result2;
}

function queryHandler3() {
    // do something
    d3.resolve();
    return result3;
}

function alldone(result1, result2, result3) {
     // do something
    return result4;
}

// the top level $.when
$.when(d1, d2, d3).done(function() {
    alldone();
});

如何重置延迟或解决,以便再次触发所有完成?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用Async library

对于您的情况,您可以使用async.parallelasync.series  取决于你想要同时或按顺序运行你的任务

在浏览器https://www.jsdelivr.com/package/npm/async

中使用该库

答案 1 :(得分:0)

我用我认为不太优雅的解决方案解决了这个问题,但它确实有效。

function queryHandler1() {
    // do something
    alldone(); 
}

function queryHandler2() {
    // do something
    alldone();
}

function queryHandler3() {
    // do something
    alldone();
}
var numCalls = 0;
function alldone() {
     if (numCalls === 2) {
          // do something
          console.log("YES ALL DONE");
     } else {
          numCalls ++;
     }
}

有任何改进吗?

由于