返回值而不是promise [停止嵌套延迟的promise]

Sum*_*hal 7 javascript deferred angularjs es6-promise

我有一堆由于顶级函数而嵌套的函数是一个ajax请求.所以我想在嵌套子函数中返回值而不是promise.

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;
    }
Run Code Online (Sandbox Code Playgroud)

孩子1

$rootScope.userInit = function() {
        return getUserPermissions(vzid)
          .then(function(data) {

            //Some code here

            return data;
          })

    }
Run Code Online (Sandbox Code Playgroud)

孩子2

let checkAuthorize = function(toState) {
  return $rootScope.userInit().then(
    function(data) {
//some code here 
      return data;
    });
}
Run Code Online (Sandbox Code Playgroud)

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()
      }
  })
Run Code Online (Sandbox Code Playgroud)

在3级,我们仍在努力做出承诺.可以child 2返回值而不是promise.

期望@ Level 3

$rootScope.isAuthorized = checkAuthorize(toState);

  if ($rootScope.isAuthorized == true) {
      $log.info('is Authorized')
      } else {
      $log.info('is not Authorized');
      throw new AuthorizationError()
     }
Run Code Online (Sandbox Code Playgroud)

tia*_*dws 6

事实是:你不能,除非你想要意大利面条代码.

最好的解决方案是使用类似ui-router的解决方案,在向用户显示页面之前获得所需的所有权限.然后,您可以在控制器上使用它们而无需任何异步调用.


Sum*_*hal 0

我正在使用 $state.transitionTo 方法来调用 before $stateChangeStart

var transitionTo = $state.transitionTo;
$state.transitionTo = function(to, toParams, options) {
  var from = $state.$current,
    fromParams = $state.params;

  to = to.name ? to : $state.get(to);

    $rootScope.state = {
      to: to.self,
      toParams: toParams,
      from: from.self,
      fromParams: fromParams,
      options: options
    }

  if (options.notify && options.notify !== false) {
    return $q.reject(new AuthorizationError('Rejecting $state.transitionTo', 'Transition Rejected'));
  } else {
    return checkAuthorize(to).then(function(auth) {
      $rootScope.isAuthorized = auth;
        return transitionTo(to, toParams, options)
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

状态改变开始

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
  $log.info("Route change start from", fromState.url, "to", toState.url);
  //event.preventDefault();

  if ($rootScope.isAuthorized == true) {
    $log.info('is Authorized')
    //$state.go($rootScope.toState.name);
  } else {
    event.preventDefault();
    $log.info('is not Authorized');
    throw new AuthorizationError('User is not Authorized.', 'NOT_AUTHENTICATED')
  }

});
Run Code Online (Sandbox Code Playgroud)