Wpis z mikrobloga

#programowanie #javascript #webdev
Co myślicie o takiej funkcji-obiekcie?

const stc = {
delayTimer: {},
sleep: (m, name) => new Promise(r => stc.delayTimer[name] = setTimeout(r, m)),
waitClean: async (ms, name)=> {
if (stc.delayTimer[name])
clearTimeout(stc.delayTimer[name]);
delete stc.delayTimer[name];
return await stc.sleep(ms, name);
}
}

Służy do robienia opóźnienia, ale dodatkowo gdy wywołasz ją ponownie zanim upłynie zadany czas, to czyści licznik i liczy od nowa, nie puszcza funkcji dalej.

async function s (){
console.log("wy");
await stc.waitClean(5000, "mek");
console.log("my");
}

np gdy w konsoli odpalać będziesz s() zanim upłynie 5 sekund od poprzedniego odpalenia, to "my" nie będzie się pojawiać. gdy przestaniesz, to dokończy ostatnie liczenie i wyświetli się "my".

Co sądzicie? Można to zrobić lepiej?
  • 11
@chester: No tak, a co?
Chodzi o formę, bo poprzednia której używałem wymagała osobnej zmiennej itd.
Ale pytam, czy można lepiej?

I jeszcze kwestia, której nie jestem pewien, co się dzieje, gdy kolejne wywołania są zawieszone na await i nigdy nie ruszają dalej?
@look997: nie mam pojęcia, nie przejmuję się pamięcią w JS, polegam w pełni na GC :P. Jedynie używając RxJS do streamów to dbam aby nie doszło do wycieków pamięci w postaci nieusuniętych observerów, no i tam mam od ręk itakie funkcje jak debounce, delay etc. A bez rxjs do debounców, throtlów użyłbym lodasha, imo nie ma sensu pisać tego ręcznie chyba, że do poćwiczenia/rozkimny
@mcsQ: W sumie, nie interesowałem się loadash. Może i zacznę używać.
Oczywiście że dla sportu. Dlatego też wrzuciłem do oceny. (na codereview mi ładnie wypisali co jak).