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