使用捕获是否需要抛出

时间:2018-09-23 22:35:59

标签: javascript ecmascript-6 error-handling promise throw

这里的新手问题-我有一个程序通过promises / fetch进行API调用。我想添加一个捕获量,但我想知道是否还需要在其中添加一个throw语句?还是我可以单独使用渔获物?

1 个答案:

答案 0 :(得分:1)

  

我想添加一个渔获,但是我想知道是否还需要在其中添加一个throw语句?

否,除非您想要的编程结果,否则您不需要throw

.catch()用于“处理”被拒绝的承诺。您自己,不必使用throw来处理被拒绝的承诺。

如果您想在存在被拒绝的承诺时执行一些代码,然后将被拒绝的承诺返回给调用者,则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,这都是个人喜好。