2013-08-07 12 views
13

私はこれに多くの問題を抱えています。私はSOやGoogleで何かを見つけることができません。私はreturn "some return value";作品

間違っ
<!DOCTYPE html> 
<html data-ng-app="testApp"> 
    <head> 
     <title></title> 
    </head> 
    <body> 
     <div data-ng-controller="myController"> 
     {{test}}<br/> 
     {{test2}}<br/> 
     {{test3}} 
     <ul> 
      <li data-ng-repeat="member in members">{{ member.firstname}}</li> 
     </ul> 
     </div> 
     <script type="text/javascript" src="angular.min.js"></script> 
     <script type="text/javascript"> 
     angular.module('testApp', ['memberFactory']); 

     angular.module('testApp',[]) 
     .factory('memberFactory', function($http){ 

      var obj = {}; 
      obj.data = "abcd"; 
      obj.getResponse = function(){ 
       var temp = {}; 
       $http.get('hello.php').success(function(data){ 
         alert(data); 
         temp =data; 

       }); 

       return "some return value"; 
      } 

      return obj 
     }); 

     function myController($scope, memberFactory){ 
      $scope.test= "testString"; 
      $scope.test2= memberFactory.data; 
      $scope.test3= memberFactory.getResponse(); 

     } 
     </script> 
    </body> 
</html> 

をやっているが、私は一時、そのヌルを返すようにしようと。私はこれを働かせるために様々な方法を試しましたが、私はちょうど$http.get()の機能の中に一時的な値を設定しているように見えません。

おそらく何か簡単ですか?何かアドバイスをいただければ幸いです

+0

角度1.0.1を使用していますが、これは1.3で破損します。 –

答えて

24

利用延期:あなたは$ http.getを実行すると

obj.getResponse = function(){     
    var temp = {}; 
    var defer = $q.defer(); 
    $http.get('hello.php').success(function(data){ 
      alert(data); 
      temp =data; 
      defer.resolve(data); 

    }); 
    return defer.promise; 
} 
+2

$ qとは何ですか?私は定義されていない。これは別の図書館ですか? – jonnie

+2

'$ http'と同じ方法で注入する必要があります。これは、promise/deferパターンのAngularJS実装です。 –

+0

@CodeZilla okだが、何もせずに '{" promise ":{}}'を返すので、私はまだデータにアクセスできない。 – jonnie

14

ここで何が起こっているが、それは順番に実行されません、$ http.getの非同期性の結果であります。つまり、それは分岐し、コードの残りの部分に沿って実行されます。これは、サーバーの待ち時間に対応するために行われます。

悪い視覚化があります。

.getResponse Called    Return Temp. 
|-------------------|--------------| 
        |---------------------------------| 
        $http.get ~Waiting for Server~ Temp assigned to data. 

値が与えられる前にどのようにTempが返されるのか分かりますか?

ありがたいことに、Angularが約束しているものを使うことができます。これは関数から返すことができる変数で、後で '解決'されます。あなたはこのような約束を具体化します。

var myPromise = $q.defer(); 

あなたはその後、通常の方法で、後の機能で、この約束を返すことができ

myPromise.resolve(data); 

を使用して、それに値を割り当てます。すなわち、

return myPromise.promise 

もちろん、このすべてについては、関数パラメータにインクルードする$ qライブラリが必要です。

+0

おっと、私が投稿する前にCodezillaの答えを見ていない、彼らは正しいアイデアを持っています。私はこれを説明として残しておきます。 –

+0

説明のおかげで、残念ながら私はちょうど '{" promise ":{}}'を得ました。 – jonnie

+0

すごく申し訳ありません!ちょうど私のコードのバグに気づいた。 myPromise.promise(実際の約束オブジェクトのように)を返す必要があります。次に動作する必要があります。あなたを迷子に導いて申し訳ありません! –

0
//in $httpProvider.interceptors  
if (typeof response.data === 'string') { 
    return response; 
} 
else { 
    return response.data; 
} 
+0

あなたは正確に何を答えているのか説明してください。それは理解するのに役立つでしょう。単純にコードを書くことではっきりと分かりません。 – UDID

関連する問題