【发布时间】:2016-02-20 08:21:36
【问题描述】:
我有一个 API,其中包含对服务器引发错误时出现的问题的有用描述(状态 = 500)。描述作为响应文本的一部分出现。我的客户端代码使用 Aurelia 通过aurelia-fetch-client 使用通用方法调用 api:
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) 错误。
希望有一种访问该响应文本的好方法吗?
【问题讨论】:
-
是否将
catch放在then之前(在顶部代码上)有帮助? -
@dandavis 我已经尝试了几种变体,但都没有运气。然而,Jeremy 将承诺链保留在
race()中的建议似乎奏效了。
标签: javascript aurelia fetch-api aurelia-fetch-client