2013-08-29 11 views
6

Próbowałem zrozumieć, jak odroczone działa, więc we wszystkich z nich używają setTimeout.Dlaczego używać setTimeout w odroczonym

this.callbacks;// array of functions reference 
this.callbacks.forEach(function(callback){ 
    window.setTimeout(function(){ 
      callback(data); 
    },0); 
}); 

jeden przykład z this questions które używają setTimeout

resolve: function (data) { 
    this.promise.okCallbacks.forEach(function(callback) { 
     window.setTimeout(function() { 
     callback(data) 
     }, 0); 
    }); 
    }, 

Jaka jest różnica między wywołaniem funkcji w pętli przez setTimeout niż callback(); lub callback.call();

Odpowiedz

10

Powodem tego jest umożliwienie wątkowi javascript wywołania innych zdarzeń oczekujących w kolejce.

Javascript jest jednowątkowy. Jeśli zdarzenie zostanie wyzwolone, może zostać uruchomione tylko po zakończeniu uruchomionego kodu.

Opóźnienie zerowe skutecznie informuje tłumacza JS, że wywołanie funkcji callback jest częścią nowego kontekstu i że aktualny blok kodu został zakończony. Oznacza to, że JS skorzysta z okazji i zadzwoni pod numer callback(), aby sprawdzić, czy nie ma potrzeby obsługiwać innych zdarzeń.

Chociaż może to opóźnić callback() się od nazywany jest natychmiast, może to być dobre dla ogólnej wydajności witryny:

Inne wydarzenia, które mogą być obsługiwane muszą zawierać kliknij imprez i innych wyzwalaczy UI. Jeśli nie dasz im szansy na wykonanie, może to spowodować, że twój interfejs użytkownika stanie się powolny lub nie reaguje.

2

setTimeout seriach po upłynięciu czasu i proces JavaScript jest bezpłatny.

Natychmiast uruchomi się wywołanie zwrotne i zablokuje wszystko inne.

+0

ale czas ustawiony jako 0 –

+0

@ Moein7tl: W rzeczywistości istnieje dolna granica limitu czasu, który jest większy niż 0 (IIRC to około 4 ms dla popularnych przeglądarek). Stąd 0 oznacza "tak szybko, jak możesz się do tego przyzwyczaić". Prawdopodobnie ludzie, którzy korzystają z zerowego limitu czasu wiedzą o tym i robią to celowo. – Jon

+1

@ Moein7tl - Tak, zauważ, że po tym jak powiedziałem "upłynął czas", powiedziałem "**" i "**. – Quentin

2

setTimeout(func,0) nie jest wywoływany natychmiast.

Po prostu symuluje funkcję asynchroniczną z funkcją zwrotną.

function asyncFunc(callback) { 
    console.log("step1"); 
    setTimeout(callback,0); 
    console.log("step2"); 
} 

asyncFunc(function() {console.log("async step")}); 
/* output: 
step1 
step2 
async step 
*/ 

https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout

Kod wykonywany przez setTimeout() prowadzony jest w odrębnym kontekście wykonania do funkcji, z którego została wywołana

Tak to działa w odrębnym kontekście realizacji, ale przed jego wykonaniem javascript powinien zakończyć bieżące wykonanie z powodu javascript działającego na pojedynczym wątku.

Nie ma znaczenia, ile czasu podczas bieżącej realizacji, ponieważ MUSI zakończyć przed wykonaniem innego zadania.

Jeśli masz nieskończoną pętlę przed zakończeniem zadania, na przykład, nigdy nie zostanie wywołana twoja funkcja oddzwaniania.

1

setTimeout() Umożliwia zarejestrowanie funkcji, która ma zostać wywołana, po upływie określonego czasu.

Metoda obiektu okna Window2016 planuje uruchomienie funkcji po upływie określonej liczby milisekund. setTimeout() zwraca wartość, która może być przekazana do clearTimeout(), aby anulować wykonanie zaplanowanej funkcji.

Jeśli wywołasz setTimeout() z czasem 0 ms, określona funkcja nie zostanie od razu wywołana . Zamiast tego jest umieszczany w kolejce do wywołania "tak szybko jak to możliwe" po wszystkie aktualnie obsługiwane programy obsługi zdarzeń kończą działanie.