Angular $ http承诺总能解决

时间:2016-09-13 11:12:40

标签: angularjs http promise interceptor angular-promise

在与.then(successFunc).catch(errFunc)的每次$ http通话中(或then(successFunc, errFunc),始终会调用then / success(承诺已成功解决)。

实施例

$http.get('/some/resource') 
//   /some/resource --> HTTP 400
    .then(function(response)
    {
        console.log('success');
    })
    .catch(function(reason)
    {
        console.log('error');
    })

// Console: 
// - success

这是预期的行为还是导致这种行为的原因?

2 个答案:

答案 0 :(得分:1)

不,这不是预期的行为。通常情况下,它应该.then()上的HTTP 2xx.catch()以及HTTP 4xx上的HTTP 5xx(不确定其他人)。

所描述的行为可能是由另一个.catch()返回已解决的承诺引起的。

稍微改变一下的例子:

//In some Service:
function getResources()
{
    $http.get('/some/resource') 
    //   /some/resource --> HTTP 400
        .then(function(response)
        {
            console.log('service success');
            return response;
        })
        .catch(function(reason)
        {
            console.log('service error');
            // IMPORTANT: although this is returned 
            // in a .catch() it returns a resolved promise
            return reason;
        });
}

//In some Controller:
someService.getResources()
    .then(function(response)
    {
        console.log('controller success');
    })
    .catch(function(reason)
    {
        console.log('controller error');
    });


// Console:
// - service error
// - controller success

请注意,这也可能是由注册的http interceptor

引起的
$httpProvider.interceptors.push(function($q)
{
    return {
        'response': function(response)
        {
            // do something
            return response;
        },
        'responseError': function(rejection)
        {
            // do something
            return rejection; // <-- this causes the problem
            // instead do
            return $q.reject(rejection);
        }
    }
}

答案 1 :(得分:1)

您的示例将拒绝转换为已解决的承诺

$http.get('/some/resource') 
//   /some/resource --> HTTP 400
    .then(function(response)
    {
        console.log('success');
        //IMPORTANT -- return to chain data
        return response;
    })
    .catch(function(reason)
    {
        console.log('error');
        //IMPORTANT -- throw to chain rejections
        throw reason;
    })

当catch处理程序省略throw语句时,该函数返回undefined 拒绝转换为解析undefined的承诺。

在代码中查找遵循相同错误模式的http interceptor

函数式编程中的规则总是return(或throw)。