Piszemy funkcję defer, która pozwoli nam opóźnić wykonywanie funkcji JavaScript. Do dzieła.
Najpierw postarajmy się zrozumieć setTimeout. To powinniśmy znać:
setTimeout(() => {
console.log("hello world");
}, 2000);
Do setTimeout możemy jednak przekazywać funkcje po nazwie oraz parametry po timeoucie:
setTimeout(console.log, 2000, "hello world!");
Nasza funkcja będzie bardzo prosta, wręcz banalna:
const defer = (fn, ...args) => setTimeout(fn, 1, ...args);
defer(console.log, "Hello World!");
console.log("I run first!");
//I run first!
//Hello World
Zobaczmy na coś takiego:
const defer = (fn, ...args) => setTimeout(fn, 1, ...args);
console.log(defer(console.log, "Hello World!"));
console.log("I run first!");
//7
//I run first
//Hello World!
Cóż, setTimeout zwraca ID, które zwraca defer. I zwraca je natychmiast, bo potrzebne jest natychmiast (np. do clearTimeout). Logowane też jest natychmaist.
Potem idzie nieopóźniona funkcja log, później zaś deferowany console.log, po przejściu przez całą pętlę zdarzeń.
Nie wiem nawet, czy timeout 0 nie byłby wystarczający, ale może lepiej nie kusić losu – nigdy nie wiemy, czy nie ma tam jakiegoś zabezpieczenia, że 0 równa się wykonanie funkcji natychmiast.