我有一个帮助函数,用于将fetch
与CouchDB一起使用,结尾为:
...
return fetch(...)
.then(resp => resp.ok ? resp.json() : Promise.reject(resp))
.then(json => json.error ? Promise.reject(json) : json)
当我在其他地方使用它时,我的印象是我可以.catch
明确拒绝:
above_function(its_options)
.then(do_something)
.catch(err => do_something_with_the_json_error_rejection_or_resp_not_ok_rejection_or_the_above(err))
但是,唉,我似乎无法控制拒绝。
我之后的特定错误是HTTP 401响应。
是什么给出了?
(请注意return
s中隐含的ES6 .then
答案 0 :(得分:34)
function test() {
return new Promise((resolve, reject) => {
return reject('rejected')
})
}
test().then(function() {
//here when you resolve
})
.catch(function(rej) {
//here when you reject the promise
console.log(rej);
});

答案 1 :(得分:3)
确保每次拨打then()
都会返回一个值。
例如
var url = 'https://www.google.co.in';
var options = {};
var resolves = Promise.resolve();
resolves.then(() => {
console.log('Resolved first promise');
var fetchPromise = fetch(url, options);
fetchPromise.then(() => {
console.log('Completed fetch');
});
})
.catch(error => {
console.log('Error', error);
});
请注意console
显示未捕获的异常。但是,如果您返回了内部承诺(或任何其他值,最终通过resolve
转变为承诺),您最终会使承诺变得扁平化,因此异常会冒泡。
var url = 'https://www.google.co.in';
var options = {};
var resolves = Promise.resolve();
resolves.then(() => {
console.log('Resolved first promise');
var fetchPromise = fetch(url, options);
return fetchPromise.then(() => {
console.log('Completed fetch');
});
})
.catch(error => {
console.log('Error', error);
});
请注意,异常会冒充外部承诺。希望这能清除一些事情。
答案 2 :(得分:0)
承诺拒绝属于then
函数的第二个参数。
function test() {
return new Promise((resolve, reject) => {
return reject('rejected')
})
}
test().then(function() {
//here when you resolve
}, function(rej) {
//here when you reject the promise
console.log(rej)
})
答案 3 :(得分:0)
为什么不将其包装在try / catch
块中,我已从ivo复制了以下内容
function test() {
return new Promise((resolve, reject) => {
return reject('rejected');
})};
(async ()=>{
try{
await test()
}catch(er){
console.log(er)
}})();