2015-11-04 166 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>

相關問題