【发布时间】:2017-11-24 09:42:27
【问题描述】:
我有一堆嵌套的函数,因为顶层函数是一个 ajax 请求。 所以我想在嵌套子函数中返回一个值而不是一个承诺。
家长
let getUserPermissions = function(id) {
let deferred = $q.defer();
let promise = accessRequestService.getPermissions(id);
promise.then(function(data) {
deferred.resolve(data);
}, function(err) {
deferred.reject(err);
})
return deferred.promise;
}
孩子 1
$rootScope.userInit = function() {
return getUserPermissions(vzid)
.then(function(data) {
//Some code here
return data;
})
}
孩子 2
let checkAuthorize = function(toState) {
return $rootScope.userInit().then(
function(data) {
//some code here
return data;
});
}
3 级
checkAuthorize(toState).then( function(val){
$rootScope.isAuthorized = val;
if ($rootScope.isAuthorized == true) {
$log.info('is Authorized')
} else {
$log.info('is not Authorized');
throw new AuthorizationError()
}
})
在第 3 级,我们仍在使用 Promise。 child 2 可以返回一个值而不是承诺。
3 级期望
$rootScope.isAuthorized = checkAuthorize(toState);
if ($rootScope.isAuthorized == true) {
$log.info('is Authorized')
} else {
$log.info('is not Authorized');
throw new AuthorizationError()
}
【问题讨论】:
-
getUserPermissions不等同于简单的function(id) { return accessRequestService.getPermissions(id); }吗?无需纠结Deferred。 -
@Thomas 用于基于服务发送的成功/错误的另一个计算。此代码中不存在。
-
那么你仍然可以做
function(id) { return accessRequestsService.getPermissions(id).then(function(data) { ... }, function(err) { ... }); }。您很少需要直接使用defer(),除非您正在编写自己的承诺“源”。 -
你不能返回一个值而不是一个promise,这就是异步执行的重点,你处理latter的值回调或承诺
-
async-await是您需要的,但取决于您所针对的 ES 版本
标签: javascript angularjs es6-promise deferred