Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在运行配置之前等待异步调用(Angular JS)_Javascript_Html_Angularjs_Angular Ui Router - Fatal编程技术网

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

Javascript 在运行配置之前等待异步调用(Angular JS),javascript,html,angularjs,angular-ui-router,Javascript,Html,Angularjs,Angular Ui Router,我需要在加载任何状态之前解析http调用 angular.module('myModule', []) .run(function($http, MyFactory) { $http.get('/api..') .success(function(data){ MyFactory.setData(data); //Store data in a service }

我需要在加载任何状态之前解析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 ..
               } 
            }
         }
     });


我试图将
$http
作为我的第一个状态
.main
的解析,但是如果你直接转到
.main.app
,第一个解析会在第二个解析之后执行。

我相信你可以用以下模式创建依赖承诺解析,其中
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'
    }
});


我建议不要从
.run
函数中调用,从工厂自己执行
ajax
&这样做的方法ajax将返回一个承诺。。因此,该方法将从
state
resolve
调用,并从resolve返回
promise
可能会是一个更好的名称。我只是将其存储在工厂的本地。我删除了帖子。无法使其正常工作。Idk-我猜
storeDate
对我来说听起来像一篇帖子(或者
storeData?
)打字错误?你是在处理数据还是约会?啊,我明白了,嗯,让我想想,为了满足你的需要,我试着编辑一下,我想我明白你在这里想做什么。你能告诉我这是否有效吗?
.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();
        }]
    }
});