承诺来自AJAX内部的递归AJAX成功

时间:2016-08-12 17:46:36

标签: javascript angularjs

我有一个控制器调用服务方法。在该服务方法内部有一个AJAX调用。在AJAX调用的成功中,我正在调用一个不同的服务方法,该方法具有递归的AJAX调用,具体取决于AJAX响应的结果。我想要的是在我的控制器中检索递归AJAX调用的FINAL结果。 (见底部更新代码)

控制器:

app.controller('myController', function($scope, myService) {

   $scope.getResults = function(){
      myService.lookup().then(function(data){
         console.log(data); //This returns just the 'lookup' data, but I want the final AJAX results of the recursive 'lookupUUID' service method here
      });
   }

   $scope.getResults();

});

服务

app.service('myService', function() {
   var self = this;

   //This one is recursive 
   self.lookupUUID = function(lookupData){
      $.get('/another/url/here', function (data){
            if(!data[1]){
               self.lookupUUID(data);
            } else {
               return data;
            }
         }, 'json'
      )
   }

   self.lookup = function(){
      $.get('/some/url/here', function (data){
            if(!data[1]){
               return self.lookupUUID(data);
            } else {
               return data;
            } 
         }, 'json'
      );
   }

});

目前在我的控制器中,我只是从服务的data方法接收原始AJAX调用中的lookup

更新后的代码:

控制器:

app.controller('myController', function($scope, myService) {

   $scope.getResults = function(){
      myService.lookup().then(function(data){
         console.log(data);
      });
   }

   $scope.getResults();

});

服务

app.service('myService', function($http) {
   var self = this;

   //This one is recursive 
   self.lookupUUID = function(lookupData){
      return (
         $http.get('/another/url/here', function (data){
               if(!data[1]){
                  return self.lookupUUID(data);
               } else {
                  return data;
               }
            }, 'json'
         ) //end of GET
      ); //end of return
   } //end of self.lookupUUID

   self.lookup = function(){
      return ( 
         $http.get('/some/url/here', function (data){
               if(!data[1]){
                  return self.lookupUUID(data);
               } else {
                  return data;
               } 
            }, 'json'
         ) //end of GET
      ); //end of return
   } //end of self.lookup

});

不幸的是,这仍然不会返回lookupUUID递归方法的最终结果。我从第一个AJAX lookup方法中获取了数据。

4 个答案:

答案 0 :(得分:1)

  

我实际上收到了控制台错误:"TypeError: Cannot read property 'then' of undefined"。在我的控制器的.then

在功能层次结构的每个级别返回非常重要。

self.lookup = function(){
  //
  //return the promise
  return (
      $http.get('/some/url/here').then(function onSuccess(response){
          //return data to the success handler
          return response.data;
      }); 
  );
}

由于未能返回lookup函数,该函数返回undefined,当然缺少.then属性。

答案 1 :(得分:0)

您正在返回解析数据,然后您无法使用.then方法,而是返回promise,而您使用的是没有then方法的jquery。使用$ http代替具有then方法的,你可以返回promise。

  

注意: - 返回self.lookupUUID(数据); on!数据并不是一个好主意,而是返回即将发生的事情并在控制器中进行检查。

 app.service('myService', function($http) {
       var self = this;

       //This one is recursive 
       self.lookupUUID = function(lookupData){
         return $http.get('/another/url/here', function (data){
                  return data;                  
             })
       }

       self.lookup = function(){
          $http.get('/some/url/here', function (data){
                if(!data[1]){
                   return self.lookupUUID(data);
                } else {
                   return data;
                } 
             });
       }

    });

<强>控制器

 myService.lookup().then(function(data){
         console.log(data);
      },function(err){
   console.log(err)
 });

答案 2 :(得分:0)

感谢@georgeawg和SO Question/Answer的帮助,我已经能够找到解决方案。

<强>服务

    self.lookupUUID = function(data, mode){
      var lookupUuidPromise = $http.get('/another/url/here');

      var p = lookupUuidPromise.then(function (response){
        if(response.data[1] != 0){
           return self.lookupUUID(response.data);
        } else {
           return response.data;
        }
      })

      return p;
   }

   self.lookup = function(domain, mode){
     var lookupPromise = $http.get('/some/url/here');

     var p = lookupPromise.then(function(data){
       if(data.data[1] != 0){
          return self.lookupUUID(data.data, mode);
       } else {
          return data.data;
       }
     });

     return p;
   }

答案 3 :(得分:-1)

这是使用$ q service:(https://docs.angularjs.org/api/ng/service/ $ q)

完成的
var deffered = $q.defer();
$timeout(function() {
    $timeout(function() {
        $timeout(function() {
           deffered.resolve({test : 'value'})
        }, 10)
    }, 10)
}, 10);
return deffered.promise;

P.S。除非你知道100%需要使用它,否则不要在角度使用jquery。使用$ .get代替$ http服务很奇怪。