Restangular 运行 onFulfilled 承诺回调,即使承诺被拒绝
Restangular running onFulfilled callback on promise even when promise is rejected
我正在将我的主题数据移动到服务中并尝试智能化代码,但我 运行 遇到了一些问题。
当我关闭 API 服务器和 运行 创建函数时,我希望只触发 onRejected
回调。 onFulfilled
和 onRejected
回调都被触发了。
服务
(function(){
'use strict';
angular
.module('app')
.factory('$cmSubjectData', $cmSubjectData);
function $cmSubjectData($log, Restangular, $mdToast) {
var service = {
getAll: getAll,
getById: getById,
update: update,
create: create,
destroy: destroy
};
return service;
function getAll() {
return subjects().getList().then(handleSuccess, handleError('Error getting all subjects'));
}
function getById(id) {
return subjects().one(id).get().then(handleSuccess, handleError('Error getting this subject'));
}
function update(subject) {
Restangular.all('subjects')
.post(subject)
.then(handleSuccess, handleError('Error updating subject'));
}
function create(subject) {
Restangular.all('subjects')
.post(subject)
.then(successToast(subject.basicInfo.firstName + ' has been created'), handleError('Error creating subject'));
}
function destroy(id) {
var subject = subjects().one(id);
subject.remove()
.then(successToast('Subject has been deleted!'), handleError('There was an error deleting this subject'));
}
// Private Functions
function subjects() {
return Restangular.service('subjects');
}
function handleSuccess(data) {
$log.info('Success');
return data;
}
function handleError(error) {
return function () {
$log.warn(error);
};
}
function successToast(content) {
$mdToast.show(
$mdToast.simple()
.content(content)
);
}
}
})();
控制器
(function() {
'use strict';
angular
.module('app')
.controller('SubjectNewCtrl', SubjectNewCtrl);
function SubjectNewCtrl($cmSubjectData) {
var vm = this;
vm.subject = {};
vm.createSubject = $cmSubjectData.create;
}
})();
查看调用函数的位置:
<button ng-click="vm.createSubject(vm.subject)">Add</button>
如有任何帮助,我们将不胜感激。
当你
.then(successToast(...))
你立即 运行 successToast(...)
并将 return 值从那个传递给 .then()
这不是你想要的时间。请记住,如果您希望稍后执行它,您必须将函数引用传递给 .then()
。如果您在函数中包含括号 ()
,那么这会告诉 Javascript 立即执行您的函数。在这种情况下,这不是您想要的。如果你没有额外的函数参数,你可以这样做:
.then(successToast)
但是,因为您在调用它时有想要传递的参数,所以您不能那样做。所以,你有两个选择。你可以让它像 handleError()
一样工作,其中使用参数调用它只是 returns 一个函数(所以这就是像这样传递给 .then()
的东西:
function successToast(content) {
return function() {
$mdToast.show($mdToast.simple().content(content));
}
}
然后,它会像您一样接到电话:
.then(successToast(subject.basicInfo.firstName + ' has been created'))
或者您可以在调用本身中插入您自己的存根函数引用:
.then(function() {
return successToast(subject.basicInfo.firstName + ' has been created');
});
这两个示例都将函数引用传递给 .then()
,并且直到稍后 .then()
调用该函数引用时才执行您的逻辑核心。
我正在将我的主题数据移动到服务中并尝试智能化代码,但我 运行 遇到了一些问题。
当我关闭 API 服务器和 运行 创建函数时,我希望只触发 onRejected
回调。 onFulfilled
和 onRejected
回调都被触发了。
服务
(function(){
'use strict';
angular
.module('app')
.factory('$cmSubjectData', $cmSubjectData);
function $cmSubjectData($log, Restangular, $mdToast) {
var service = {
getAll: getAll,
getById: getById,
update: update,
create: create,
destroy: destroy
};
return service;
function getAll() {
return subjects().getList().then(handleSuccess, handleError('Error getting all subjects'));
}
function getById(id) {
return subjects().one(id).get().then(handleSuccess, handleError('Error getting this subject'));
}
function update(subject) {
Restangular.all('subjects')
.post(subject)
.then(handleSuccess, handleError('Error updating subject'));
}
function create(subject) {
Restangular.all('subjects')
.post(subject)
.then(successToast(subject.basicInfo.firstName + ' has been created'), handleError('Error creating subject'));
}
function destroy(id) {
var subject = subjects().one(id);
subject.remove()
.then(successToast('Subject has been deleted!'), handleError('There was an error deleting this subject'));
}
// Private Functions
function subjects() {
return Restangular.service('subjects');
}
function handleSuccess(data) {
$log.info('Success');
return data;
}
function handleError(error) {
return function () {
$log.warn(error);
};
}
function successToast(content) {
$mdToast.show(
$mdToast.simple()
.content(content)
);
}
}
})();
控制器
(function() {
'use strict';
angular
.module('app')
.controller('SubjectNewCtrl', SubjectNewCtrl);
function SubjectNewCtrl($cmSubjectData) {
var vm = this;
vm.subject = {};
vm.createSubject = $cmSubjectData.create;
}
})();
查看调用函数的位置:
<button ng-click="vm.createSubject(vm.subject)">Add</button>
如有任何帮助,我们将不胜感激。
当你
.then(successToast(...))
你立即 运行 successToast(...)
并将 return 值从那个传递给 .then()
这不是你想要的时间。请记住,如果您希望稍后执行它,您必须将函数引用传递给 .then()
。如果您在函数中包含括号 ()
,那么这会告诉 Javascript 立即执行您的函数。在这种情况下,这不是您想要的。如果你没有额外的函数参数,你可以这样做:
.then(successToast)
但是,因为您在调用它时有想要传递的参数,所以您不能那样做。所以,你有两个选择。你可以让它像 handleError()
一样工作,其中使用参数调用它只是 returns 一个函数(所以这就是像这样传递给 .then()
的东西:
function successToast(content) {
return function() {
$mdToast.show($mdToast.simple().content(content));
}
}
然后,它会像您一样接到电话:
.then(successToast(subject.basicInfo.firstName + ' has been created'))
或者您可以在调用本身中插入您自己的存根函数引用:
.then(function() {
return successToast(subject.basicInfo.firstName + ' has been created');
});
这两个示例都将函数引用传递给 .then()
,并且直到稍后 .then()
调用该函数引用时才执行您的逻辑核心。