2013-08-16 12 views
15

Nadal nie jest mi wiadomo, jaka jest różnica między wywołaniem resolver's resolve() vs fulfill()? Widzę, że zarówno funkcje, jak i terminy "rozwiązuj obietnicę" i "spełnij obietnicę" często mrugają.q.js: różnica między resolve() i fulfill()

Kiedy powinienem używać każdego?

+0

Nie widzę metody "spełnij" w dokumentacji "q". https://github.com/kriskowal/q/wiki/API-Reference – Barmar

+0

zobacz także [Jaka jest właściwa terminologia dla obietnic javascript] (http://stackoverflow.com/a/29269515/1048572) – Bergi

Odpowiedz

17

Powinieneś użyć resolve. deferredPromise.resolve(nextPromise) oznacza, że ​​wszystko, co czeka na deferredPromise, będzie teraz czekać na nextPromise. Jeśli nextPromise wcale nie jest obietnicą, staje się spełnioną obietnicą, która informuje o wszystkim, co czeka na nią, aby wartość stała się dostępna.

Metoda fulfill to zły pomysł, który zostanie wycofany i ostatecznie zniknie całkowicie. fulfill jest semantycznie równoważne resolve we wszystkich przydatnych przypadkach. Istnieje tylko jeden argument: deferredPromise.fulfill(value) jest łatwiejszy do interpretacji przez ludzi niż deferredPromise.resolve(value), ponieważ resolve jest przeciążony do obsługi zarówno nextPromise i finalValue.

Problem z istniejącym fulfill polega na tym, że deferredPromise.fulfill(rejectedPromise) jest semantycznie paradoksalny.

+0

... chyba że pozwolilibyśmy na zagnieżdżone obietnice - semantycznie czyste :-) – Bergi

+0

@Bergi, było dużo dyskusji na ten temat, ale 'postanowienie' nie musi się zmieniać. Mówi się o przeniesieniu przymusu do "ówczesnego" (i innych) i użyciu 'flatMap' do rozwijania ściśle monadycznych obietnic. –

15

Ogólnie rzecz biorąc, rozwiązać oznacza, że ​​ELEKER odnosi sukces lub nie. To właśnie powoduje wywołanie akcji then. Może się zdarzyć dokładnie raz dla każdej danej obietnicy.

spełniają oznacza "rozwiązać" pomyślnie. To spowoduje wywołanie zwrotne sukcesu w akcjach then. Odpowiednikiem "spełnienia" dla niepowodzenia jest odrzucenie.

z innej perspektywy, można kategoryzować status każdej obietnicy w danym momencie jako „nierozwiązany” (czasami nazywane także oczekiwaniu) lub „rozwiązany” i „rozwiązane” posiada sub-stany "spełnione" i "odrzucone". Obietnica w statusie "spełnione" ma wartość o wartości, a obietnica w statusie "odrzuconym" ma powód.

Poszczególne metody w każdym interfejsie API używane do reprezentowania tych pojęć są różne. Niestety istnieje wiele postów i dokumentów na blogu, które mylą te terminy, w szczególności używając "fullfill", gdy mają na myśli "rozwiązać" lub odwrotnie.

Q

nie wiem Q bardzo dobrze, ale wydaje się, że jego metoda resolve faktycznie spełnia obietnicę (podkreślenie dodane):

Wywołanie postanowienie z przyczyn wartość inna niż obietnica obiecuję być spełniona z tą wartością.

Skręt jest jednak to, że można również nazwać deferred.resolve z obietnicą, w którym to przypadku pierwsza obietnica bardziej lub mniej zakłada stan przechodzi w obietnicy. Na przykład, jeśli przekazana obietnica jest w stanie "oczekującym", obietnica przyjmuje stan oczekiwania na przekazaną obietnicę. To sugeruje nieco dziwną semantykę, że metoda o nazwie resolve w rzeczywistości nie rozwiązuje obietnicy.

+0

Podoba mi się twoje wyjaśnienie . Masz rację, to naprawdę mylące, że różne implementacje API wybierają inne znaczenie dla 'resolve' i' fulfill'. – demisx