Должно ли сообщение Promise.reject быть завершено в Error?
Использование native (ES6) Promise. Следует отклонить с помощью Error:
Promise.reject(new Error('Something went wrong'));
Или я должен просто отклонить строку:
Promise.reject('Something went wrong');
И в чем разница в поведении браузера?
Ответы
Ответ 1
Да, это определенно должно. Строка не является ошибкой, когда у вас есть ошибки, обычно это означает, что что-то пошло не так, что означает, что вам действительно понравится хорошая трассировка стека. Нет ошибки - нет трассировки стека.
Точно так же, как с try/catch, если вы добавите .catch
к отброшенному отказу, вы хотите иметь возможность регистрировать трассировку стека, бросая руины строк, которые для вас.
Я на мобильный, поэтому этот ответ довольно короткий, но я действительно не могу подчеркнуть, насколько это важно. В больших (10K + LoC) приложениях трассировки стека в отклонениях действительно делали разницу между легкой удаленной охотой за ошибками и длинной ночью в офисе.
Ответ 2
Я рекомендую использовать Error
только объект (а не строку) для отправки причин.
Обоснование
Другие части кода генерируют Errors
внутри причины отказа от Promise...
Если какой-то код не работает, исключение возвращает объект Error
. Также, если вы вызовете какую-либо внешнюю библиотеку, которая не поддерживает Promise, она выкинет объект Error
, когда что-то не удастся.
Если одна из ошибок, упомянутых выше, встречается внутри Promise, она будет преобразована в catch
с объектом Error
.
Поэтому, если вы будете использовать string
в качестве причины отклонения обещания, вы должны ожидать, что улов может произойти с вашим string
(частью вашего кода) или Error
(при возникновении некоторой общей ошибки). Таким образом, вам придется использовать уродливый код (err.message || err)
везде, когда вам придется обрабатывать эту ошибку.