【问题标题】:Angular-UI Router - Resolve not waiting for promise to resolve?Angular-UI 路由器 - 解决不等待承诺解决?
【发布时间】:2015-05-17 05:21:39
【问题描述】:

所以总结一下,我正在使用 angular-ui 路由器解析函数来检索特定于状态的数据。然而,它似乎并没有完全等待承诺解决:

state('parent.ChildState', {
                url: '/myUrl?param1&param1',
                templateUrl: 'views/list.view.html',
                controller: 'MyController',
                resolve: {
                    data: resolveData
                }
            }).

    function resolveData($stateParams, Utils) {
        var filters = Utils.getFilters($stateParams);

        DataService.myDataObj = DataService.get(filters, function(result, headers) {
            DataService.myDataObj = result;
        });
        return DataService.myDataObj;

        // Note I have also tried returning directly the DataService.get call however this makes all the below console log statements as undefined (see below for the controller code to know what I mean). So I do the assignment first and then return that.
    }

现在在控制器中,我有一个在加载时执行的函数,如下所示:

    function ExpensesController(DataService) {

        $scope.viewData = DataService;

        initData();

        function initData() {
            // this generally logs a ngResource and shows the full data obj on console
            console.log($scope.viewData.myDataObj);

           // this gets undefined on console
           console.log($scope.viewData.myDataObj.someField1); 

           // this log fine, however why do I need to do promise      
           // resolve? should be resolved already right?
           $scope.viewData.myDataObj.$promise.then(function() {
               console.log($scope.viewData.myDataObj.someField1);
           });

【问题讨论】:

    标签: angularjs angular-ui-router


    【解决方案1】:

    由于您需要解析的数据是异步的,因此您需要返回一个 Promise 并在回调函数中添加 return 语句。

    function resolveData($stateParams, Utils) {
        var filters = Utils.getFilters($stateParams);
    
        return DataService.get(filters, function(result, headers) {
             DataService.myDataObj = result;
             return DataService.myDataObj
        });
    }
    

    您可以阅读ui-router resolve docs 了解更多关于解析器如何工作以及它们应该何时返回承诺或纯值的信息。

    【讨论】:

    • 不幸的是,我也尝试过该方法,但这是我最初的实现,但在我的示例中,所有 3 个 console.log 语句都返回 undefined
    【解决方案2】:

    我不知道我是否遇到了你的问题 :),但这是我觉得不对的地方

    1) 在resolve中返回一个promise,它不应该被resolve

    function resolveData($stateParams, Utils) {
        var filters = Utils.getFilters($stateParams);
        return DataService.get(filters);       
     }
    

    2) 在控制器中,您应该注入在解析中声明的数据而不是 DataService,因此您的控制器应该是

    function ExpensesController(data) {
            $scope.viewData = data;
    }
    

    【讨论】:

    • 由于一些技术原因,我还不能使用这种方法,我需要引入一个新的服务对象来注入,但在解析中,返回值应该已经是一个承诺。跨度>
    猜你喜欢
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    相关资源
    最近更新 更多