Что с этим не так?
Но шаблон работает!
Повезло тебе. К сожалению, это, вероятно, не так, как вы, вероятно, забыли какой-то крайний случай. В более чем половине случаев, которые я видел, автор забыл позаботиться об обработчике ошибок:
return new Promise(function(resolve) {
getOtherPromise().then(function(result) {
resolve(result.property.example);
});
})
Если другое обещание будет отклонено, это произойдет незамеченным, вместо того, чтобы распространяться на новое обещание (где оно будет обработано) - и новое обещание остается навсегда ожидающим, что может вызвать утечки.
То же самое происходит в том случае, если ваш код обратного вызова вызывает ошибку - например, когда result
нетproperty
и выдается исключение. Это было бы необработанным и оставило бы новое обещание нерешенным.
Напротив, использование .then()
автоматически позаботится об обоих этих сценариях и отклонит новое обещание при возникновении ошибки:
return getOtherPromise().then(function(result) {
return result.property.example;
})
Отложенный антипаттерн не только громоздок, но и подвержен ошибкам . Использование .then()
для создания цепочек намного безопаснее.
Но я справился со всем!
В самом деле? Хорошо. Тем не менее, это будет довольно подробно и обильно, особенно если вы используете библиотеку обещаний, которая поддерживает другие функции, такие как отмена или передача сообщений. Или, может быть, в будущем, или вы хотите поменять свою библиотеку на лучшую? Вы не захотите переписать свой код для этого.
Методы библиотек ( then
) не только изначально поддерживают все функции, они также могут иметь определенные оптимизации. Их использование, скорее всего, сделает ваш код быстрее или, по крайней мере, позволит оптимизировать будущие изменения библиотеки.
Как мне этого избежать?
Поэтому, когда вы обнаруживаете, что создаете вручную Promise
или Deferred
уже задействованы уже существующие обещания, сначала проверьте API библиотеки . Отложенный антипаттерн часто применяется людьми, которые видят обещания [только] как образец наблюдателя - но обещания - это больше, чем обратные вызовы : они должны быть составными. Каждая приличная библиотека имеет множество простых в использовании функций для составления обещаний любым мыслимым образом, заботясь обо всех низкоуровневых вещах, с которыми вы не хотите иметь дело.
Если вы обнаружили необходимость составить некоторые обещания по-новому, которые не поддерживаются существующей вспомогательной функцией, то ваша последняя функция с неизбежными отложенными значениями должна быть вашей последней опцией. Подумайте о переходе на более содержательную библиотеку и / или сообщите об ошибке в вашей текущей библиотеке. Его сопровождающий должен иметь возможность извлекать композицию из существующих функций, реализовывать для вас новую вспомогательную функцию и / или помогать определять крайние случаи, которые необходимо обработать.
getStuffDone
оболочку функции и просто использовать литерал Promise?