如何在两个异步函数完成后运行一个函数

How to run a function after two async functions complete

本文关键字:函数 运行 一个 两个 异步      更新时间:2023-09-26

假设我有一个调用setTimeout的函数数组。

[
  function(cb){
    setTimeout(function(){
      cb('one');
    }, 200);
  },
  function(cb){
    setTimeout(function(){
      cb('two');
    }, 100);
  }
]

有没有办法访问时间参数(200、100)并将其总和保存到变量中?

只有当这两个函数都完成时,我才想执行一个函数。

更好的方法是使用promise和Promise.all:

var task1 = new Promise(function(resolve,reject) {
    setTimeout(function() {
        //do something
        resolve();
    }, 100);
});
var task2 = new Promise(function(resolve,reject) {
    setTimeout(function() {
        //do something
        resolve();
    }, 200);
});
Promise.all([task1, task2]).then(function() {
    //will be executed when both complete
});

您可以用计数的闭包来模拟它。

function out(s) {
    var node = document.createElement('div');
    node.innerHTML = s + '<br>';
    document.getElementById('out').appendChild(node);
}
var f = [
        function (cb) { setTimeout(function () { cb('one'); }, 100); },
        function (cb) { setTimeout(function () { cb('two'); }, 200); }
    ],
    useCounter = function () {
        var count = 2;
        return function (s) {
            count--;
            out(s + ' ' + count);
            !count && out('done');
        }
    }();
f[0](useCounter);
f[1](useCounter);
<div id="out"></div>