路由解析即使在错误请求下也会通过

Route resolve going through even on a bad request

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

$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;
    }
}

我试过了,但在 dev 中出现了 CORS 错误,这是完全可以预料的,但 st运行ge 的事情是,即使 $http 被拒绝了路线已解决。

我进行了调试,看到我得到了 HTTP status code 405getPersonFailed 函数是 运行,但 $q.all 仍然得到解决。我尝试更改为 $q.reject 然后它按预期工作并且路线从未实现。

注意 $http 调用的错误对象说 status: 0statusText: ""

$http promise的处理方式和$q的处理方式不一样吗?

我认为这是因为您的 catch 处理程序正在通过返回字符串来解析承诺。尝试明确拒绝捕获中的承诺或完全删除捕获。

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

或者你可以在 catch 中抛出,这也会导致 promise 被拒绝

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

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

经过一些研究,我发现了为什么你会出现这种奇怪的行为。

需要知道的是 promise.catch() return 一个全新的承诺,即 resolved 在你的 getPersonsFailed 函数的末尾。

为避免这种情况,您需要return拒绝承诺。

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

你也可以像这样把你的 resolve 写得小很多(但也许你的语法是故意的)

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

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

如果您没有在 .catch() 方法中执行任何其他操作,我建议您直接删除它。

希望对您有所帮助。