В чем разница между ошибкой Promise.reject и объектом Promise.reject? - PullRequest
0 голосов
/ 27 сентября 2018

Я читал учебник по nodejs, в котором говорится об отклонении в nodejs.Они говорят, что лучше всего отклонять ошибку вместо строки или простого текста.Возьмем пример этого кода.

Это пример отклонения строки

function cookMeat(chef){
    grillMeat(chef)
    .then(meat => {
        if(chef.isTired){
             return Promise.reject(chef.tiredReason);
         }
         return Promise.resolve(meat);
    })
}
function cookNoodle(cheif){
    boilNoodle(chef)
    .then(noodle => {
        if(chef.isTired){
             return Promise.reject(chef.tiredReason);
         }
         return Promise.resolve(noodle);
    })
}

function cook(){
    let chef
    prepareFood()
    .then(c => {
        chef = c;
        return true;
    })
    .then(() => cookMeat(chef))
    .then(() => cookNoodle(chef))
    .catch(err => {
         state: Fail,
         reason: error
     })
     .then(res => {
         state:Ready
     })
}
cook()
.then((res) => serveCustomer(res))

И это пример отклонения ошибки

function cookMeat(chef){
    grillMeat(chef)
    .then(meat => {
        if(chef.isTired){
             return Promise.reject(new Error(chef.tiredReason));
         }
         return Promise.resolve(meat);
    })
}
function cookNoodle(cheif){
    boilNoodle(chef)
    .then(noodle => {
        if(chef.isTired){
             return Promise.reject(new Error(chef.tiredReason));
         }
         return Promise.resolve(noodle);
    })
}

function cook(){
    let chef
    prepareFood()
    .then(c => {
        chef = c;
        return true;
    })
    .then(() => cookMeat(chef))
    .then(() => cookNoodle(chef))
    .catch(err => {
         state: Fail,
         reason: error.message
     })
     .then(res => {
         state:Ready
     })
}
cook()
.then((res) => serveCustomer(res))

Так как я хочуиспользовать отклонение, чтобы пропустить часть цепочки обещаний.Так что мне интересно, есть ли разница?

1 Ответ

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

Отклонения wPromise аналогичны выбрасыванию исключений / объектов ошибок.

Есть два правила, которые применяются к выбрасыванию исключений, которые применяются и здесь:

  1. В javascript лучше бросатьОшибка объекта.Помимо прочего, вы получите информацию о стеке.Это также то, что большинство людей ожидают, используя кодовую базу javascript.
  2. Не используйте исключения для управления потоком

Второй - такой распространенный совет, вы можете его погуглитьдословно и узнать больше.Вы используете отклонения Promise в качестве управления потоком, и это плохая идея.

Хотя ваши функции можно немного переписать.Это даже лучше:

function cookMeat(){
    grillMeat()
    .then(meat => {
        if(meat.isRaw){
             throw new Error(meat.rawReason);
        }
        return meat;
    });
}

function cookNoodle(){
    boilNoodle()
    .then(noodle => {
        if(noodle.isRaw){
            throw new Error(noodle.rawReason);
        }
        return noodle;
    })
}

function cook(){
    return prepareFood()
    .then(() => cookMeat())
    .then(() => cookNoodle())
    .catch(err => {
        state: Fail,
        reason: error.message
    })
    .then(res => {
        state:Ready
    })
}
cook()
.then((res) => talkWithCustomer(res))

Я избавился от ваших операторов Promise.reject и Promise.resolve, потому что они не имеют значения в функции then ().Рекомендация по их использованию действительно применима «вне» цепочки then ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...