承诺链不按预期工作
问题描述:
使用下面的代码,即使服务器返回500,我的控制器的publish()
也会始终转到createCompleted()
。我当时的印象是,当从服务器返回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
}
所以你的情况,因为你不返回任何东西,假设从值为“未定义”返回的承诺解决。
http://stackoverflow.com/q/25372160/1048572的可能重复。另请参阅[这些控制流程图](http://stackoverflow.com/a/24663315/1048572)和http://stackoverflow.com/q/26076511/1048572 – Bergi 2015-02-05 22:02:14