Geciktirici dekoratör.
delay(f,ms) adında bir dekoratör yazın ve bu dekoratör her f in çaÄırılmasında ms milisaniye kadar geciktirilsin.
ÃrneÄin:
function f(x) {
alert(x);
}
// Saklayıcı
let f1000 = delay(f, 1000);
let f1500 = delay(f, 1500);
f1000("test"); // "test" yazısı 1000ms sonra gelir.
f1500("test"); // "test" yazısı 1500ms sonra gelir.
DiÄer bir deyiÅle delay(f, ms) f fonksiyonunun ms kadar geciktirilmiÅ versiyonunu döner.
Yukarıdaki kodda, f tek argümanlı bir fonksiyondur. Fakat sizin çözümünüzde bu tüm argümanların ve kaynaÄın this Åeklinde fonksiyona iletilmesi gerekmektedir.
Ãözüm:
function delay(f, ms) {
return function() {
setTimeout(() => f.apply(this, arguments), ms);
};
}
Yukarıda ok fonksiyonunun nasıl kullanıldıÄına dikkat edin. BildiÄiniz gibi, ok fonksiyonlarında this ve arguments bulunmaz, bunun için f.apply(this, arguments) , this ve argumentsâı saklayıcıdan(wrapper) alır.
EÄer sıradan bir fonksiyon paslarsanız, setTimeout bunu argümansız this=window ( tarayıcıda ) olacak Åekilde çaÄırır, bundan dolayı saklayıcıdan bu deÄerleri iletebilmek için biraz daha kod yazmalıyız:
function delay(f, ms) {
// `this` ve diÄer argümanların setTimeout içerisindeki saklayıcıdan iletilmesini saÄlar.
return function(...args) {
let savedThis = this;
setTimeout(function() {
f.apply(savedThis, args);
}, ms);
};
}
function delay(f, ms) {
return function() {
setTimeout(() => f.apply(this, arguments), ms);
};
};