Angularjs $timeout Servisini Durdurmak ve Test Etmek (cancel/flush)

$timeout servisi, angular'da setTimeout() metodunu çevreleyen bir built-in servis; ek olarak geliştirme sırasında ek bir fayda sağlamasa bile*, kod testi sırasında, flush gibi metodlar ile, test sürecini kolaylaştırıyor/hızlandırıyor.

(*) ek olarak sunduğu zamanlayıcısı promise olarak atayıp .cancel() metodu ile clearTimeout işlevi görmesi açısıdan daha hoş bir yaklaşıma sahip olduğunu söyleyebiliriz, fakat ek olarak herhangi bir mekanik kazandırmıyor.

İsterseniz promise iptali olayının bir örneğini gösterdikten sonra flush'ın nasıl çalıştığına bakalım;

//Controller içinde;
var timeoutProm;
timeoutProm = $timeout(function(){
   alert("çalıştı!");
}, 1000);

$timeout.cancel(timeoutProm);
// çağırıldığında bu timeout instance
// iptal edilecek ve gerçekleşmeyecek

Bunu plain javascript ile şöyle yapacaktık;

var timeoutIndc;
timeoutIndc = setTimeout(function(){
   alert("çalıştı!");
}, 1000);

clearTimeout(timeoutProm);

NOT: Ek olarak plain javascript'te clear, angular'da cancel tabirlerinin kullanıldığına da dikkat etmek gerekiyor, genellikle karışabiliyor.

Test sırasında, örneğin 1saniye boyunca setTimeout olayının başlayıp-bitmesini bekleyemeyeceğimizden, $timeout tarafında $timeout.flush() metodu ile, o anda bulunan tüm timeout kuyruğunu tamamlatmaktadır. Ek olarak timeout servisi tarafından sunulan $timeout.verifyNoPendingTasks() boolean değer dönerek, o anda herhangi bir instance'ın kuyrukta olup olmadığını da kontrol edebiliyorsunuz.

$timeout.flush(), eğer bekleyen task yoksa error verdiğinden dolayı, genelde şu şekilde kullanıyoruz;

if($timeout.verifyNoPendingTasks()){
   $timeout.flush();
}
// eğer süresini bekleyen herhangi bir
// task varsa başlat ve tamamla
Yorumları Göster veya Yeni Yorum Yaz