在执行配置之前等待异步调用运行 (Angular JS)

3

在任何状态加载之前,我需要解决一个http调用。

angular.module('myModule', [])
    .run(function($http, MyFactory) {
        $http.get('/api..')
           .success(function(data){
                MyFactory.setData(data);
                //Store data in a service
            });
    })
    .config(function($stateProvider) {
        $stateProvider
        .state('main', {...})
        .state('main.app'{
            url: '/app'
            resolve: {
               data: function(MyFactory) {
                  MyFactory.getData();
                // This block needs to be run after my $http call in 'run' has been resolved.
                return ..
               } 
            }
         }
     });

.factory('MyFactory', function () {
     var data = '';
     return {
        setData: function(_data) {
           data = _data
        },
        getData: function() {
           return data;
        }
     } 
};

我曾尝试将$http作为我的第一个状态.main的解析器,但是如果直接进入.main.app,则会在第二个解析器之后执行第一个解析器。


我建议不要从.run函数中调用此函数,而是从工厂本身进行ajax调用,并且执行该ajax的方法将返回一个承诺。因此,该方法将从stateresolve中调用,并从resolve返回该promise - Pankaj Parkar
1个回答

1
我相信你可以通过以下模式来构建依赖承诺的解决方案,其中setData链将在.main中完成,并且在我们在.main.app中解决getData时得到满足。无需在.run()中执行此操作,而是以下是我认为你试图实现的简单解释...
.factory('MyFactory', function($http, $q) {

    function setData() {

        var deferred = $q.defer();

        $http.get('/endpoint').success(function(response) {

            // do something with data - we just want to resolve the response so this block is executed

            deferred.resolve(response)
        });

        return deferred.promise;
    }

    function getData() {
        return $http.get('/endpoint');
    }

    return {
        getData: 'getData',
        storeData: 'storeData'
    }
});

.state('main', {
    resolve : {
        set: ['MyFactory', function(MyFactory) {
            return MyFactory.setData();
        }]
    }
})
.state('main.app', {
    resolve: {
        data: ['set', 'MyFactory', function(saved, MyFactory) {
            // -- set must be resolved
            return MyFactory.getData();
        }]
    }
});

首先是一个 $http.get(.. 然后是一个 $http.post? 为什么我要使用 post 方法?在 post 请求中应该使用哪个 URL? - Joe
啊,抱歉。“Set”可能是一个更好的名称。我只是在我的工厂中将其存储在本地。我已经删除了这篇文章。无法让它正常工作。 - Joe
我不知道 - 我猜 storeDate 对我来说听起来像是一个帖子 (或者是 storeData?) 打错了吗?你是在处理数据还是日期? - scniro
啊,我明白了,嗯,让我想一想。 - scniro
我尝试进行一些编辑以更好地满足您的需求,我“认为”我看到您在这里尝试做什么。您能告诉我这是否有效吗? - scniro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接