angularjs $ q then()> catch()> then(),取消执行last then()

时间:2017-05-15 23:37:37

标签: angularjs angular-promise

我有以下代码(为简洁起见而简化):

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链接。

1 个答案:

答案 0 :(得分:2)

一个捕获区"救援"承诺并允许稍后.then次呼叫正常进行。如果你想避免这种行为,只需在catch块中重新抛出错误。

.catch(function (response) {
  Notify('error', response.data.msg);
  throw response.data.msg;
});