路由解析即使在错误请求下也会通过
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 405
,getPersonFailed
函数是 运行,但 $q.all
仍然得到解决。我尝试更改为 $q.reject
然后它按预期工作并且路线从未实现。
注意 $http
调用的错误对象说 status: 0
和 statusText: ""
$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()
}
您的服务器响应将在您的控制器中作为 persons
和 jobs
注入。
如果您没有在 .catch() 方法中执行任何其他操作,我建议您直接删除它。
希望对您有所帮助。
在创建我这样的视图之前,我需要解决两个服务调用
$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 405
,getPersonFailed
函数是 运行,但 $q.all
仍然得到解决。我尝试更改为 $q.reject
然后它按预期工作并且路线从未实现。
注意 $http
调用的错误对象说 status: 0
和 statusText: ""
$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()
}
您的服务器响应将在您的控制器中作为 persons
和 jobs
注入。
如果您没有在 .catch() 方法中执行任何其他操作,我建议您直接删除它。
希望对您有所帮助。