Promise 链没有按预期工作
Promise chains don't work as expected
使用下面的代码,即使服务器返回 500,我的控制器的 publish()
也会始终转到 createCompleted()
。我的印象是 catch()
会在 400 或 500 时执行代码从服务器返回。
// 在役
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"。
使用下面的代码,即使服务器返回 500,我的控制器的 publish()
也会始终转到 createCompleted()
。我的印象是 catch()
会在 400 或 500 时执行代码从服务器返回。
// 在役
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"。