Javascript 在运行配置之前等待异步调用(Angular JS)
我需要在加载任何状态之前解析http调用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 }
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();
}]
}
});