Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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 Angularjs ajax返回不一致_Javascript_Ajax_Angularjs - Fatal编程技术网

Javascript Angularjs ajax返回不一致

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(){

我对使用$HTTPPOST的Angularjs(v1.2.14)有一个问题,ajax调用返回的值在视图中不一致。这意味着代码实际上可以工作,但有时当我重新加载页面(Ctrl+F5)时,数据不会显示(如空obj),但当我尝试重新加载页面时,数据会显示或不显示(如50-50%的几率)

以下是我的一些代码:

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;
    }
  }
]);