我有一个 API,其中包含服务器引发错误(状态 = 500)时出现的问题的有用描述。该描述作为响应文本的一部分。我的客户端代码使用 Aurelia,通过以下方式调用 apiaurelia-fetch-client
使用通用方法进行调用:
function callRemoteService(apiName, timeout) {
return Promise.race([
this.http.fetch(apiName),
this.waitForServer(timeout || 5000) // throws after x ms
])
.then(response => response.json() )
.catch(err => {
if (err instanceof Response) {
// HERE'S THE PROBLEM.....
err.text().then(text => {
console.log('Error text from callRemoteService() error handler: ' + text);
throw new Error(text)
});
} else if (err instanceof Error) {
throw new Error(err.message);
} else {
throw new Error('Unknown error encountered from callRemoteService()');
}
});
}
请注意,我想以一致的方式捕获服务器(获取或超时)错误,然后throw
仅向调用视图返回一条简单的错误消息。我可以调用callRemoteService
成功,当返回 500 时捕获错误:
callRemoteService(this.apiName, this.apiTimeout)
.then(data => {
console.log('Successfully called \'' + this.apiName +
'\'! Result is:\n' + JSON.stringify(data, null, 2));
})
.catch(err => {
console.log('Error from \'' + this.apiName + '\':',err)
});
但是,我无法访问响应文本,因为fetch
提供了text()
返回承诺的方法,这会干扰我原本愉快的承诺链。上面的代码不起作用,给我留下了一个Uncaught (in promise)
error.
希望有一种访问该响应文本的好方法吗?
这应该可以解决问题:
function callRemoteService(apiName, timeout = 5000) {
return Promise.race([
this.http.fetch(apiName)
.then(
r => r.json(),
r => r.text().then(text => throw new Error(text))
),
this.waitForServer(timeout)
]);
}
顺便说一句,我喜欢你正在做的事情Promise.race
- 技术不错!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)