2014-06-23 60 views
0

說我有這麼一點代碼,我想知道所有回調何時完成。我會怎麼做?如何跟蹤回調中的超時

var cb1 = function() { 


setTimeout(function() { 
    console.log('cb1 fired'); 
    }, Math.random() * 1000); 
}; 

var cb2 = function() { 
    setTimeout(function() { 
    console.log('cb2 fired'); 
    }, Math.random() * 1000); 
}; 
var cb3 = function() { 
    setTimeout(function() { 
    console.log('cb3 fired'); 
    }, Math.random() * 1000); 
}; 

function fireCBs(cbArray) { 
} 

fireCBs([cb1, cb2, cb3]); 
+0

你只是想知道什麼時候該功能已經開始或者你是否試圖執行另一個功能,當所有人都已經解僱? –

+0

我道歉,這是我正在尋找的後者。我想在其他完成後調用另一個函數。 – Chestone

+0

這是Promise.all()解決的確切問題。不幸的是,承諾尚未標準化。 –

回答

0

首先,我不會重複你喜歡的代碼。每個函數調用隨機時間間隔設置超時。正因爲如此,你可以簡化你的代碼。下面是你的代碼的基本簡化,它允許你修改你在一個地方調用setTimeout的方式。此外,它還標準化了您的每個認證機構的功能。最後,我添加Timeout時間段作爲TimeoutFunctions的一個屬性,它允許您自定義超時時間。

var Utilities = { 
    TimeoutFunctions: [ 
    { 
     timeoutPeriod: null, 
     fn: function() { 
     console.log("cb1 fired"); 
     } 
    }, 
    { 
     timeoutPeriod: null, 
     fn: function() { 
     console.log("cb2 fired"); 
     } 
    }, 
    { 
     timeoutPeriod: null, 
     fn: function() { 
     console.log("cb3 fired"); 
     } 
    } 
    ], 
    fireCBs: function() { 
    Utilities.totalCBsFired = Utilities.TimeoutFunctions.length; 
    for (var i=0; i < Utilities.TimeoutFunctions.length; i++) { 
     setTimeout((function(fn){ 
     return function() { 
      fn(); 
      Utilities.totalCBsFired --; 
      if (Utilities.totalCBsFired == 0) { 
      //Execute your extra code here 
      console.log("all cbs fired"); 
      } 
     }; 
     })(Utilities.TimeoutFunctions[i].fn), 
     Utilities.TimeoutFunctions[i].timeoutPeriod || (Math.random() * 1000)); 
    } 
    } 
} 

Utilities.fireCBs(); 

OK測試了代碼及其工作。這裏是一個工作小提琴http://jsfiddle.net/esqJ5/

+0

對不起。但以上是一個有工作演示的潛在解決方案 –