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

Detect asynchronous calls are finished, then trigger another function?

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

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

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

感谢您的帮助!

您可以使用Async library

对于您的情况,您可以使用 async.parallel or async.series 取决于您是想 运行 同时还是按顺序执行您的任务

在浏览器中使用库https://www.jsdelivr.com/package/npm/async

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

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 ++;
     }
}

有什么改进吗?

谢谢