2016-04-29 55 views
6

klauzula 2.2.4 obietnicy/A + specyfikacja mówi:Jaki jest zamysł w punkcie 2.2.4 specyfikacji Promise/A +?

onFulfilled lub onRejected nie musi być wywołana przed zakończeniem wykonywania kontekst stosu zawiera tylko kod platformy.

Następnie w uwagach stwierdza, że:

Here „Kod platforma” oznacza silnik, środowisko, i obiecują kod realizacji. W praktyce to wymaganie zapewnia, że ​​ onFulfilled i onRejected wykonują asynchronicznie, po wywołaniu zdarzenia , które następnie zostanie wywołane, i ze świeżym stosem.

Czy ma to na celu zapewnienie, że gdy w łańcuchu jest duża liczba funkcji wypełnionych, ich wykonanie nie spowoduje zablokowania wątku?

Czy jest coś jeszcze między wierszami, których nie czytam?

+0

Zobacz także [tutaj] (https://stackoverflow.com/a/28750658/1048572), [tutaj] (https://stackoverflow.com/a/29454966/1048572) oraz w mniejszym stopniu w [tych ] (https://stackoverflow.com/q/23447876/1048572) [wątki] (https://stackoverflow.com/q/29963129/1048572) – Bergi

Odpowiedz

8

Rozumowanie jest, że gdy wywołania zwrotne są zawsze asynchroniczne zamiast ewentualnie asynchroniczne, daje bardziej spójne i rzetelne API do użycia. Rozważmy następujący kod

var pizza; 
browseStackOverflow().then(function(){ 
    eatPizza(pizza); 
}); 
pizza = yesterdaysLeftovers; 

Teraz fragment wyraźnie zakłada onFulfilled nie będzie nazwany od razu, a jeśli to nie był przypadek, że wkrótce mają niewykorzystaną pizzę leżące wokół i bylibyśmy wyszliśmy głodni. Chociaż w tym przypadku błąd będzie łatwa do naprawienia, kolejność wykonywania jest łatwiejsza do naśladowania, a zatem api jest łatwiejszy w użyciu, gdy można zrobić takie założenia.

Istnieje zamknięte repozytorium GitHub issue on the Promises/A+ z dyskusją na ten temat.