Javascript Angularjs ajax返回不一致
我对使用$HTTPPOST的Angularjs(v1.2.14)有一个问题,ajax调用返回的值在视图中不一致。这意味着代码实际上可以工作,但有时当我重新加载页面(Ctrl+F5)时,数据不会显示(如空obj),但当我尝试重新加载页面时,数据会显示或不显示(如50-50%的几率) 以下是我的一些代码:Javascript Angularjs ajax返回不一致,javascript,ajax,angularjs,Javascript,Ajax,Angularjs,我对使用$HTTPPOST的Angularjs(v1.2.14)有一个问题,ajax调用返回的值在视图中不一致。这意味着代码实际上可以工作,但有时当我重新加载页面(Ctrl+F5)时,数据不会显示(如空obj),但当我尝试重新加载页面时,数据会显示或不显示(如50-50%的几率) 以下是我的一些代码: myGuitarApp.service('songService', ['$http','$q', function( $http, $q ){ this.list = function(){
myGuitarApp.service('songService', ['$http','$q', function( $http, $q ){
this.list = function(){
return $http
.post("getSongs.php") // return all songs from my DB in json
.success( function( data ){
console.log("1: ajax done");
})
.error( function(){
console.log("error");
});
}
}])
myGuitarApp.controller('returnAllSongs', function( $scope, $http, songService){
songService.list().then(
function( data ){
console.log( data );
$scope.songs = data.data;
}, function( data ){
console.log("not success");
});
});
我读过一些关于在这种情况下使用$q或延迟对象的文章,但仍然不幸运,同样的问题仍然发生
更新1:
我确实尝试了$q方法,但返回的数据仍然随机显示(空obj或完整数据)。查看控制台日志,我发现“returnpromise”一行总是出现在“ajaxdone”之前。这是个问题还是什么
this.list2 = function(){
var defer = $q.defer();
$http
.post("getSongs.php")
.success( function( data ){
console.log("1: ajax done");
defer.resolve(data);
})
.error( function(){
console.log("error");
defer.reject();
});
console.log("return promise");
return defer.promise;
}
在success函数中,返回数据
.success( function( data ){
console.log("1: ajax done");
return data;
})
你还需要回报一个承诺
this.get = function(from, to){
var deferred = $q.defer();
var url = 'user/activities?from='+from+'&to='+to;
$http.get(url).success(function(data, status) {
// Some extra manipulation on data if you want...
deferred.resolve(data);
}).error(function(data, status) {
deferred.reject(data);
});
return deferred.promise;
}
那么在你的情况下就是
var deferred=$q.deferred()
$http服务已经返回了一个承诺,因此,如果您的songService不处理中间的数据,那么就没有必要将其包装在另一个承诺中。请记住,服务器可能会发送一些带有非错误http代码的意外消息,在这种情况下,承诺就会实现。我向控制台添加了调试输出。检查服务器返回的内容
myGuitarApp.service('songService', ['$http', '$q',
function($http, $q) {
this.list = function() {
return $http.post("getSongs.php");
}
}
]);
myGuitarApp.controller('returnAllSongs', ['$scope', '$http', 'songService', function($scope, $http, songService) {
songService.list().then(
function(data) {
console.log("success");
console.log(data);
$scope.songs = data.data;
}, function(data) {
console.log("not success");
console.log(data);
});
}]);
您可能希望包装post请求以执行成功检查。假设服务器有时返回意外的结果,您可以执行以下操作:
myGuitarApp.service('songService', ['$http', '$q',
function($http, $q) {
this.list = function() {
var deferred = $q.defer();
$http.post("getSongs.php").success( function(response) {
if ( response.indexOf("loading") > -1 ) { // loading would be the unexpected response, you can turn that around and search for something known in the expected response
deferred.reject(response);
} else {
deferred.resolve(response);
}
}).error( function(response) {
deferred.reject(response);
});
return deferred.promise;
}
}
]);
或者,您也可以在控制器中执行该测试。它最适合的问题是你必须考虑的。谢谢,但它仍然不能解决这个问题,我试过它有没有或没有“返回数据”,数据仍然随机出现我已经尝试了你的使用延迟的方法,但同样的问题仍然发生:(控制台在http success上记录数据。检查是否总是出现这种情况,否则可能是服务器问题。但您需要q服务,因此不要删除它。)code@andrbmgi实际上,我只是发布了更新部分,以表明我已经尝试了$q方法,但仍然不起作用。我仍然使用
return$http.post(“getSongs.php”)保留当前代码
。感谢返回承诺
出现在ajax done
之前,因为此代码是异步的。这是预期的,也是正确的。post请求发出,程序只是继续执行返回承诺
输出等等,所有这些都是在post请求完成之前出现的。一旦服务器响应了他调用了您在success
中定义的函数,并调用了error
。我将第一条现已删除的注释转换为答案。谢谢,有一件事我忘了提到,这是在我在本地pc上测试时发生的,但当我在笔记本电脑或主机上尝试时,问题似乎消失了。尝试按ctrl+f5重新启动广告页面15-20次,它总是返回完整的数据…这很奇怪
myGuitarApp.service('songService', ['$http', '$q',
function($http, $q) {
this.list = function() {
var deferred = $q.defer();
$http.post("getSongs.php").success( function(response) {
if ( response.indexOf("loading") > -1 ) { // loading would be the unexpected response, you can turn that around and search for something known in the expected response
deferred.reject(response);
} else {
deferred.resolve(response);
}
}).error( function(response) {
deferred.reject(response);
});
return deferred.promise;
}
}
]);