【问题标题】:resolve promise until state changes解决承诺直到状态改变
【发布时间】:2015-01-18 20:12:52
【问题描述】:

我的 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,但是不知道怎么正确使用。

谢谢。

【问题讨论】:

  • 您的承诺将在$stateChangeStart 事件处理程序完成执行后很久才解决。到那时,再拨打event.preventDefault() 就太迟了,而且不会有任何效果。我认为您需要重新考虑您的方法,因为这种方法行不通。

标签: angularjs state resolve


【解决方案1】:

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

.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 对象将在该隐藏状态下可供您的控制器使用,并且仅在它返回 2xx 状态代码且 error 属性等于 0 的情况下。

如果数据被解析,那么会发生状态变化并实例化控制器。如果被拒绝,这一切都不会发生。

作为个人说明,我发现这是一个处理授权的好设备。

【讨论】:

    猜你喜欢
    • 2019-03-11
    • 2021-08-04
    • 2021-09-12
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2020-05-18
    相关资源
    最近更新 更多