Co jest z tym nie tak?
Ale wzór działa!
Szczęściarz. Niestety prawdopodobnie tak nie jest, ponieważ prawdopodobnie zapomniałeś o jakiejś sprawie krawędziowej. W ponad połowie przypadków, które widziałem, autor zapomniał zająć się obsługą błędów:
return new Promise(function(resolve) {
getOtherPromise().then(function(result) {
resolve(result.property.example);
});
})
Jeśli druga obietnica zostanie odrzucona, stanie się to niezauważona, a nie zostanie propagowana do nowej obietnicy (gdzie zostanie zrealizowana) - a nowa obietnica pozostanie na zawsze w oczekiwaniu, co może spowodować wycieki.
To samo dzieje się w przypadku, gdy kod wywołania zwrotnego powoduje błąd - np. Gdy result
nie ma property
znaku i zostanie zgłoszony wyjątek. To pozostanie nierozstrzygnięte i pozostawi nową obietnicę nierozstrzygniętą.
W przeciwieństwie do tego, użycie .then()
automatycznie zajmuje się tymi dwoma scenariuszami i odrzuca nową obietnicę, gdy wystąpi błąd:
return getOtherPromise().then(function(result) {
return result.property.example;
})
Odroczony antypattern jest nie tylko uciążliwy, ale również podatny na błędy . Korzystanie .then()
z łańcuchów jest znacznie bezpieczniejsze.
Ale załatwiłem wszystko!
Naprawdę? Dobrze. Będzie to jednak dość szczegółowe i obfite, zwłaszcza jeśli korzystasz z biblioteki obietnic, która obsługuje inne funkcje, takie jak anulowanie lub przekazywanie wiadomości. A może tak będzie w przyszłości, a może chcesz zamienić swoją bibliotekę na lepszą? W tym celu nie będziesz chciał przepisać kodu.
Metody bibliotek ( then
) nie tylko natywnie obsługują wszystkie funkcje, ale mogą także mieć pewne optymalizacje. Korzystanie z nich prawdopodobnie przyspieszy kod lub przynajmniej pozwoli na optymalizację w przyszłych wersjach biblioteki.
Jak tego uniknąć?
Tak więc za każdym razem, gdy znajdziesz ręczne tworzenie Promise
lub Deferred
już istnieją obietnice, najpierw sprawdź interfejs API biblioteki . Odroczony antypattern jest często stosowany przez ludzi, którzy widzą obietnice [tylko] jako wzorzec obserwatora - ale obietnice są czymś więcej niż tylko wywołaniami zwrotnymi : powinny być możliwe do skomponowania. Każda przyzwoita biblioteka ma wiele łatwych w użyciu funkcji do komponowania obietnic w każdy możliwy do pomyślenia sposób, dbając o wszystkie rzeczy niskiego poziomu, z którymi nie chcesz sobie poradzić.
Jeśli zauważyłeś potrzebę złożenia obietnic w nowy sposób, który nie jest obsługiwany przez istniejącą funkcję pomocnika, pisanie własnej funkcji z nieuniknionymi Odroczeniami powinno być ostatnią opcją. Rozważ przejście na bardziej funkcjonalną bibliotekę i / lub zgłoś błąd w bieżącej bibliotece. Jego opiekun powinien być w stanie wyodrębnić kompozycję z istniejących funkcji, zaimplementować dla ciebie nową funkcję pomocniczą i / lub pomóc w identyfikacji przypadków skrajnych, które należy obsłużyć.
getStuffDone
opakowanie funkcji i po prostu używa literału Promise?