解决承诺直到状态改变

resolve promise until state changes

我的 angular 应用程序中有一个隐藏页面,因此只有特殊 ID 用户才能访问它。为了实现它,当状态更改为该隐藏状态时,我向服务器发送 HTTP get 请求(因为只有服务器知道该特殊 ID)。

如果服务器用错误消息响应我,那么我会阻止状态更改过程,否则用户会转到该特殊页面。

这是我使用的代码:

angular
.run(["$rootScope", "$location", "$state", "mySvc", function ($rootScope, $location, $state, mySvc) {
    var id = mySvc.getId();    
    $rootScope.$on( '$stateChangeStart', function(event, toState  , toParams, fromState, fromParams) {

        if(toState.name === "specialstate") {
            mySvc.check(id)
                .then(function(result) {
                    if(result.error !== 0) {
                        event.preventDefault();
                    }
                }, function(error) {
                    event.preventDefault();
                });                
        }

    });
}]);

服务中的功能:

        function check(id) {
        var deferred = $q.defer();
        $http({
            url: "/api/url",
            method: "GET",
            headers: {'Content-Type': 'application/json'}
            }).
            then(function (result) {
                console.log(result);
                if(result.data.error === 0) {
                    deferred.resolve(result.data);
                }
                else {
                    deferred.reject(result.data);
                }
            }, function (error) {
                deferred.reject(error);
            });
        return deferred.promise;
    };

一切正常,除了一件事:状态正在改变,没有等待请​​求结果。我想我应该使用resolve,但我不知道如何正确使用它。

谢谢。

ui-路由器支持一个解析对象,该对象定义了一组在允许状态转换之前应该解析的数据(例如,来自服务器)。

.state('hidden', {
  url: '/hidden',
  ...
  resolve: {
    data: function(mySvc) {
      var id = mySvc.getId();    
      return mySvc.check(id).then(function(result) {
        if (result.error !== 0) {
          throw new Error("not allowed");
        }
      });
    }
  }
});

定义的 data 对象将在该隐藏状态下可供您的控制器使用,并且仅当它 returns 一个 2xx 状态代码并且有一个 error 属性 等于 0.

如果数据已解析,则会发生状态更改并实例化控制器。如果被拒绝,将发生 none。

作为个人笔记,我发现这是处理授权的好工具。