Javascript 指令的无序执行
当我调用Details函数时,它给出的是空的细节,因为Details函数是在从json文件获取数据之前执行的。如何解决这个问题Javascript 指令的无序执行,javascript,angularjs,Javascript,Angularjs,当我调用Details函数时,它给出的是空的细节,因为Details函数是在从json文件获取数据之前执行的。如何解决这个问题 app.controller('loginCtrl',function($scope,login){ $scope.user=login.Details(); } app.factory('login',function($cookieStore,$http){ var users=[]; $http.get("js/user.json").success(fu
app.controller('loginCtrl',function($scope,login){
$scope.user=login.Details();
}
app.factory('login',function($cookieStore,$http){
var users=[];
$http.get("js/user.json").success(function(data){
angular.copy(data,users);
});
return{
Details:function()
{
alert(users);
return users;
}
}
当然,它会给你一个空用户,因为你已经定义了var user=[]; 然后和Ajax调用,然后您返回该用户,因为您没有异步执行此操作,所以所有这些调用都将触发同步,Javascript将很高兴返回一个emtpy用户: 有一些方法可以解决这个问题,使用承诺就是其中之一
app.factory('login',function(){
return{
Details:function(){
promise = $http.get("js/user.json");
promise.then(function(data){
return data;
});
}
}
});
或者您可以简单地执行以下操作:
app.factory('login',function(){
return{
Details:function(){
$http.get("js/user.json")
.success(function(data){
return data;
})
}
}
});
您需要在
$http.get
的成功回调中更新$scope.user
。最好的方法是在控制器中定义success函数并将其传递到服务中。因此,您的服务变成:
app.factory('login', function($cookieStore,$http){
var userCache;
return {
doLogin: function(user, password, successCallback) {
if(!userCache) {
$http.get("js/user.json").success(function(data) {
userCache = data;
successCallback(data);
});
}
}
}
}
您的控制器会将其添加到单击处理程序或其他内容中:
login.doLogin('sampleUsername', 'samplePassword', function(data) {
$scope.user = data;
});
这应该可以满足您的大部分需要,您可能需要根据验证登录的方式以及示例JSON文件包含的内容进行调整。祝你好运。可能的副本