Я хочу добавить улов, но мне интересно, нужно ли мне также добавить туда оператор throw?
Нет, вам не нужно throw
если это не тот результат программирования, который вам нужен.
A .catch()
используется для "обработки" отклоненного обещания.Вы сами не должны использовать throw
для обработки отклоненного обещания.
A throw
может использоваться вместе с .catch()
, если вы хотите выполнить некоторый код, когда естьотклоненное обещание, но затем верните отклоненное обещание звонящему.В этом случае вы бы сделали что-то вроде этого:
function someFunction() {
return fn().then(val => {
// do something here when promise resolves
return someVal;
}).catch(err => {
// do something here when promise rejects
console.log(err);
// throw the error to keep the returned promise rejected
throw err;
});
}
Если у вас просто есть .catch()
без броска внутри него, то отклоненное обещание будет считаться «обработанным» и станет решенным, а неотвергнуто.Обратите внимание, это почти то же самое, что try/catch
работает для синхронного кода.
Вот прекрасный пример, где вам не нужен throw
с .catch()
.
const rp = require('request-promise');
const defaultConfig = {...};
function readRemoteConfig(url) {
return rp({url, json: true}).catch(err => {
// when remote config is not available, substitute default config
return defaultConfig;
});
}
К вашему сведению, даже если вы хотите сохранить обещание отклоненным, вам не нужно использовать throw
, чтобы выполнить это.Вы также можете вернуть отклоненное обещание, которое даст тот же результат:
function someFunction() {
return fn().then(val => {
// do something here when promise resolves
return someVal;
}).catch(err => {
// do something here when promise rejects
console.log(err);
// return rejected promise to keep the returned promise rejected
return Promise.reject(err);
});
}
Это личное предпочтение, хотите ли вы сделать это таким образом или использовать throw
.