即使在一个糟糕的请求上,路由解析也会通过

时间:2015-12-11 13:49:06

标签: angularjs angular-ui-router angular-promise

在创建像我这样的视图之前,我需要解决两个服务调用

$stateProvider
    .state('parent', {
        url: '/parent',
        abstract: true,
        resolve: {
            resolveService: function($q, personService, jobService) {
                return $q.all({
                    persons: personService.getPersons(),
                    jobs: jobService.getJobs()
                })
            }
        }
    })

    .state('parent.child', {
        url: '/child'
    })

一项服务看起来像这样

 function getPersons() {
    var req = {
        method: 'POST',
        url: 'http://myPersonApi'
    }

    return $http(req)
    .then(getPersonsComplete)
    .catch(getPersonsFailed)

    function getPersonsComplete(response) {
        return response.data.persons;
    }

    function getPersonsFailed(error) {
        //log error
        return error;
    }
}

我试了一下,但在CORS中出现了dev错误,这是完全可以预料到的,但奇怪的是,即使$http被拒绝,路线也已解决。

我已调试并看到我收到了HTTP status code 405并且getPersonFailed函数已运行,但$q.all仍然得到解决。我试图改为只有一个$q.reject,然后按预期工作,路线从未实现。

请注意$http来电的错误对象status: 0statusText: ""

$http promise的处理方式与$q的处理方式不同吗?

2 个答案:

答案 0 :(得分:2)

我认为这是因为你的catch处理程序通过返回一个字符串来解析promise。尝试明确拒绝catch中的promise或者完全删除catch。

function getPersonsFailed(error) {
    return $q.reject(error);
}

或者你可以扔进捕获内容,这也会导致承诺被拒绝

function getPersonsFailed(error) {
    throw(error);
}

我认为这是有用的阅读:
https://gist.github.com/domenic/3889970

答案 1 :(得分:1)

经过一番研究后,我发现了为什么会有这种奇怪的行为。

要知道的是,promise.catch()会在resolved函数的末尾返回getPersonsFailed的全新承诺。

为避免这种情况,您需要返回被拒绝的承诺。

function getPersonsFailed(error) {
    //Do some logic here to handle your error in your service
    return $q.reject(error);
}

你也可以把你的决心写得那么小(但也许你的语法是故意的)

    resolve: {
       persons: personService.getPersons(),
       jobs: jobService.getJobs()
    }

您的服务器响应将在控制器中以personsjobs注入。

如果您在.catch()方法中没有做任何其他事情,我建议您只删除它。

希望它有所帮助。