Должно ли сообщение 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) везде, когда вам придется обрабатывать эту ошибку.