使用 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
.
是个人喜好
这里是新手问题 - 我有一个程序通过 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
.