【发布时间】:2019-02-27 11:08:12
【问题描述】:
这里的新手问题 - 我有一个程序通过 promises/fetch 进行 API 调用。我想添加一个 catch,但我想知道我是否还需要在其中添加一个 throw 语句?或者我可以单独使用 catch 吗?
【问题讨论】:
标签: javascript ecmascript-6 error-handling promise throw
这里的新手问题 - 我有一个程序通过 promises/fetch 进行 API 调用。我想添加一个 catch,但我想知道我是否还需要在其中添加一个 throw 语句?或者我可以单独使用 catch 吗?
【问题讨论】:
标签: javascript ecmascript-6 error-handling promise throw
我想添加一个 catch,但我想知道我是否还需要在其中添加一个 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。
【讨论】: