Javascript 承诺链不';I don’我没有按预期工作
使用下面的代码,我的控制器的Javascript 承诺链不';I don’我没有按预期工作,javascript,angularjs,promise,Javascript,Angularjs,Promise,使用下面的代码,我的控制器的publish()将始终转到createCompleted(),即使服务器返回500。我的印象是,当服务器返回400或500个代码时,就会执行catch() //在职 function create(item) { return $http .post(api, item) .then(createCompleted) .catch(createFailed); function createCompl
publish()
将始终转到createCompleted()
,即使服务器返回500。我的印象是,当服务器返回400或500个代码时,就会执行catch()
//在职
function create(item) {
return $http
.post(api, item)
.then(createCompleted)
.catch(createFailed);
function createCompleted(response) {
return response.data;
}
function createFailed(error) {
$log.error('XHR Failed for create: ' + error.data);
}
}
//内部控制器
function publish(item) {
item.published = true;
return itemService.create(item)
.then(createCompleted)
.catch(createFailed);
function createCompleted(response) {
alertService.add('success', 'success.');
$state.go('^');
}
function createFailed(error) {
alertService.add('error', 'failed');
}
}
当控制器的createFailed()
未命中时,服务createFailed()
总是命中
这是怎么回事?这是因为您没有正确地传播错误。您需要从
createFailed
函数中抛出异常或显式拒绝
function createFailed(error) {
$log.error('XHR Failed for create: ' + error.data);
throw error;
// or
return $q.reject(error); // inject $q
}
因此,在您的情况下,由于您没有返回任何内容,因此假定它是从返回的承诺中解决的,值为“undefined”。如果我在它的承诺中使用$http的success和error方法(而不是then()和catch()),会不会更好?@mare no,问题是
$http(args)
返回httpPromise和$http(args)。然后。。返回q承诺。但如果返回$http,则会执行两个错误块。但是,如果您想通过转换和传播数据进行更改,您可能希望执行,然后执行,而不是成功。的可能重复。另见和