Требуется ли бросок с помощью броска? - PullRequest
0 голосов
/ 24 сентября 2018

Вопрос новичка здесь - у меня есть программа, делающая вызовы API через обещания / выборки.Я хочу добавить улов, но мне интересно, нужно ли мне тогда иметь там оператор throw?Или я могу использовать только один улов?

1 Ответ

0 голосов
/ 24 сентября 2018

Я хочу добавить улов, но мне интересно, нужно ли мне также добавить туда оператор 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.

...