在创建像我这样的视图之前,我需要解决两个服务调用
$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: 0
和statusText: ""
$http promise
的处理方式与$q
的处理方式不同吗?
答案 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()
}
您的服务器响应将在控制器中以persons
和jobs
注入。
如果您在.catch()方法中没有做任何其他事情,我建议您只删除它。
希望它有所帮助。