Ответ 1
Ответ: да. Возможны два подхода.
.then()
Метод .then()
возвращает новое обещание, состояние которого определяется тем, что возвращается от обработчика (ов), переданного методу.
- возвращая значение/объект, который не обещает, новое обещание передается по цепочке методов с тем же разрешенным/отклоненным статусом, что и исходное обещание, но разрешено/отклонено с возвращаемым значением/объектом.
- возвращая обещание, это обещание передается по цепочке методов со статусом, который не зависит от первоначального обещания.
Таким образом, отсроченная/обезвоженная очередь обратного вызова может быть эффективно отменена, возвращая из обработчика .then()
обещание, которое никогда не будет разрешено и никогда не будет отклонено. Такое обещание можно сделать из обработчика обработчика .then()
(первый аргумент) или его обработчика отказа (второй аргумент). То же самое не может быть достигнуто с помощью методов .done()
, .fail()
или .always()
, которые возвращают оригинал Deferred/prom без изменений.
Выбросить ошибку
Невыпущенная ошибка, возникающая из обработчика .then()
, .done()
, .fail()
, .always()
или .progress()
, убьет цепочку методов, убив поток событий, в котором он запущен.
Ошибка может быть вызвана намеренно, например, throw('deliberate error')
.
Примечание
Следует отметить, что оба подхода будут только подавлять обработчики связанных цепочек (или эквивалент, достигнутый назначением).
При любом подходе любой асинхронный процесс, который уже запущен в точке, где выполняется подавление выражения return/error, будет продолжаться, и любой соответствующий обработчик done/fail/always/progress уже может быть запущен.