2015-11-04 167 views
1

说我有一个调用setTimeout的函数数组。如何在两个异步函数完成后运行函数

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

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

我想在这两方面的功能都做

+1

你可以有回调跟踪它已经多少次被调用,并执行所需的代码的第二个呼叫? – Keylan

+3

编号使用承诺:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise –

+0

你需要给你更多的上下文。也许你想要做的事可以通过使用例如承诺。 – hex13

回答

2

一个更好的办法是使用承诺和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 
}); 
0

您可以为计数封闭模仿它。

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>

相关问题