2016-08-12 4 views
0

私はサービスメソッドを呼び出すコントローラを持っています。そのサービスメソッドの内部にAJAX呼び出しがあります。 AJAX呼び出しの成功では、AJAX応答の結果に応じて再帰的なAJAX呼び出しを持つ別のサービスメソッドを呼び出しています。私が望むのは、私のコントローラで、再帰的なAJAX呼び出しの最終結果を取得することです。私はちょうどから元のAJAX呼び出しからdataを受け、私のコントローラでは現時点ではAJAXの成功の中で再帰的なAJAXからの約束

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

}); 

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

}); 

はサービス:

コントローラ(BOTTOMで更新コードを参照してください)サービスの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メソッドからコントローラにデータを戻します。これは、$ qをサービス使用して行われ

+1

あなただけの 'self.lookupUUID(データ)への再帰呼び出しの前に' return'を追加しようとしていますか; '? –

+0

この呼び出す 'self.lookupUUID' –

+0

私は実際にコンソールエラーを取得しています:" TypeError:プロパティを読み取ることができません '未定義 "。私のコントローラの '.then'行に。 – tnschmidt

答えて

0

@georgeawgとthisの助けを借りてありがとうSO Question/Answer私は解決策を考え出すことができました。

SERVICE

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; 
    } 
-1

:(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を使用しないでください。 $ httpサービスの代わりに$ .getを使うのは変です。

+0

これは$ httpと$ .getに関するものです。ありがとう。 – tnschmidt

0

解決したデータを返すと、代わりに.thenメソッドを使用してpromiseを返すことができません。そして、thenメソッドを持たないjqueryを使用しています。 the thenメソッドを持つ代わりに$ httpを使用して、約束を返すことができます。

Note:- returning self.lookupUUID(data); on !data is not good idea return what ever coming and check it in controller instead.

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) 
}); 
+0

私は助けに感謝します。私たちは近づいていると思う。私は自分のコードにいくつかの調整を加えて質問を更新しました。しかし、私は最初のAJAX呼び出しからのデータを受け取りましたが、AJAX呼び出しの再帰呼び出しは終了しません。 – tnschmidt

1

I'm actually getting console error: "TypeError: Cannot read property 'then' of undefined" . At the .then line of my controller

これは機能階層の各レベルでリターンに重要です。

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

関数に戻り値に失敗したことにより、機能はもちろん.then性を欠いundefinedを返します。

+0

あなたの答えをありがとう、しかし私はまだ再帰的ではなく、最初のAJAX呼び出しからデータを取得しているようです。調整されたコードで質問を更新しました。 – tnschmidt

+1

@tnschmidt再帰的な '$ http'呼び出しの例については、[this StackOverflow answer](http://stackoverflow.com/a/38900086/5535245)を参照してください。 – georgeawg

+0

ありがとうございました@georgeawg、それは私が最終的に働く解決策を考え出すのを助けました。私は自分の答えを掲示します。 – tnschmidt

関連する問題