【问题标题】:Detect asynchronous calls are finished, then trigger another function?检测异步调用完成,然后触发另一个函数?
【发布时间】:2018-02-09 21:13:15
【问题描述】:

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

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

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

感谢您的帮助!

【问题讨论】:

  • @user9263373 看了那个问题,但它不适用于 JavaScript,所以没有帮助,谢谢。

标签: javascript jquery asynchronous jquery-deferred


【解决方案1】:

您可以使用Async library

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

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

【讨论】:

    【解决方案2】:

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

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

    有什么改进吗?

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      相关资源
      最近更新 更多