Promise.reject错误和Promise.reject对象之间有什么区别?

时间:2018-09-27 02:51:58

标签: node.js promise

我正在阅读一些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 :(得分:0)

wPromise拒绝类似于抛出异常/错误对象。

有两个适用于抛出异常的规则也适用于此处:

  1. 在javascript中,最好抛出一个Error对象。除其他外,您将获得堆栈信息。这也是大多数人在使用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.rejectPromise.resolve语句,因为它们在then()函数中是不必要的。使用它们的建议仅适用于then()链的“外部”。