你如何处理链式承诺的错误?
How do you handle errors from chained promises?
我正在构建一个 Angular 应用程序,并有一个执行 XHR 的工厂,以及 returns 对调用它的控制器的承诺。当我遇到错误时,它会在工厂失败方法中被捕获,但因为我将其作为承诺返回,它仍会调用控制器中的成功方法。有没有办法让工厂错误传递给控制器失败方法并阻止调用控制器成功方法?原因是我想在客户端正确显示成功和错误通知。我这样做完全错了吗?
示例工厂方法:
function add(payload) {
return $http.post('/companies', payload)
.then(success)
.catch(fail);
function success(response) {
return response.data;
}
function fail(error) {
$log.log('Company Factory XHR failed: ', error.data);
}
}
对应控制器方法:
function add(isValid) {
if (isValid) {
var payload = {
company: vm.new_company
};
companyFactory.add(payload)
.then(success)
.catch(fail);
}
function success() {
getCompanies();
vm.new_company = {};
toastrFactory.success("Added company!");
}
function fail(err) {
$log.log('Companies Controller XHR Failed: ' + err.data);
}
}
如果在控制器中处理,则无需在工厂中处理承诺。
在你想要的工厂里
return $http.post('/companies', payload);
然后像您已经在控制器中一样处理它,一切顺利。
使用 .then 和 .catch 是基于承诺的功能,您现在在工厂中使用的方式,您不是 return 承诺,而是 return 其他承诺解决后的事情。您只想 return 单独的承诺,即 $http.post() 函数。
编辑:
为了增加一点深度,这就是我为这类东西设置工厂的方式...
function factory() {
var self = {};
self.addCompany = function(payload) {
return $http.post('/companies', payload);
}
return self;
}
然后在像
这样的控制器中处理它
factory.addCompany(payload)
.then(function(data) {
console.log('success', data);
})
.catch(function(data) {
console.log('something happened', data);
})
我正在构建一个 Angular 应用程序,并有一个执行 XHR 的工厂,以及 returns 对调用它的控制器的承诺。当我遇到错误时,它会在工厂失败方法中被捕获,但因为我将其作为承诺返回,它仍会调用控制器中的成功方法。有没有办法让工厂错误传递给控制器失败方法并阻止调用控制器成功方法?原因是我想在客户端正确显示成功和错误通知。我这样做完全错了吗?
示例工厂方法:
function add(payload) {
return $http.post('/companies', payload)
.then(success)
.catch(fail);
function success(response) {
return response.data;
}
function fail(error) {
$log.log('Company Factory XHR failed: ', error.data);
}
}
对应控制器方法:
function add(isValid) {
if (isValid) {
var payload = {
company: vm.new_company
};
companyFactory.add(payload)
.then(success)
.catch(fail);
}
function success() {
getCompanies();
vm.new_company = {};
toastrFactory.success("Added company!");
}
function fail(err) {
$log.log('Companies Controller XHR Failed: ' + err.data);
}
}
如果在控制器中处理,则无需在工厂中处理承诺。
在你想要的工厂里
return $http.post('/companies', payload);
然后像您已经在控制器中一样处理它,一切顺利。
使用 .then 和 .catch 是基于承诺的功能,您现在在工厂中使用的方式,您不是 return 承诺,而是 return 其他承诺解决后的事情。您只想 return 单独的承诺,即 $http.post() 函数。
编辑: 为了增加一点深度,这就是我为这类东西设置工厂的方式...
function factory() {
var self = {};
self.addCompany = function(payload) {
return $http.post('/companies', payload);
}
return self;
}
然后在像
这样的控制器中处理它factory.addCompany(payload)
.then(function(data) {
console.log('success', data);
})
.catch(function(data) {
console.log('something happened', data);
})