使用 catch 是否需要 throw

Does using catch require throw

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

I want to add a catch, but I'm wondering do I need to also then have a throw statement in there?

不,您不需要 throw 除非那是您想要的编程结果。

A .catch() 用于 "handle" 被拒绝的承诺。您自己不必使用 throw 来处理被拒绝的承诺。

A throw 可以与 .catch() 结合使用,如果你想在有被拒绝的承诺时执行一些代码,但随后 return 对调用者的承诺被拒绝。在那种情况下,你会做这样的事情:

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() 而没有在里面抛出,那么被拒绝的承诺将被视为 "handled" 并且将被解决,而不是被拒绝。请注意,这与用于同步代码的 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 来实现。您还可以 return 一个被拒绝的 promise,它将实现相同的结果:

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.

是个人喜好