我有以下代码(为简洁起见而简化):
var makeRequest = function (method, url, query, data) {
var request = {
method: method,
url: url,
params: query || {},
paramSerializer: '$httpParamSerializerJQLike',
data: data || {},
timeout: 10000
};
if (method === 'POST' || method === 'PUT') {
request.headers = { 'Content-Type': 'application/json; charset=UTF-8' };
}
return $http(request)
.then(function (response) {
response = normalizeResponse(response.data); // ensures {result, data, msg}
if (!response.result) {
throw {data: response};
}
return response;
})
.catch(function (response) {
Notify('error', response.data.msg);
});
};
调用它看起来像这样:
makeRequest('GET', '/user').then(function (response) {
console.log('user=', response.data);
});
这适用于成功的请求,但是一旦我发出失败的请求,我就会得到TypeError: Cannot read property 'data' of undefined
,因为catch()
没有(也不应该)返回任何内容,但是第二个{{ 1}}承诺仍然执行。
我希望then()
成为执行的最后一件事,并且如果请求本身失败,则任何进一步的catch()
调用都不会执行。捕获块在整个系统中是通用的,因此将它复制粘贴到任何地方都没有意义,它不是干的。是否有可能或者我必须为此做一些肮脏的黑客攻击?
注意:如果请求成功,我仍然希望可以使用promise链接。
答案 0 :(得分:2)
一个捕获区"救援"承诺并允许稍后.then
次呼叫正常进行。如果你想避免这种行为,只需在catch块中重新抛出错误。
.catch(function (response) {
Notify('error', response.data.msg);
throw response.data.msg;
});