0

私のコントローラーには、必要なすべての依存関係が注入されています。

 $scope.connect = function(url) {
    var defer = $q.defer();
    var promise = $http.get(url).then(function (response) {
         $timeout(function(){
                defer.resolve(response);
            },10000);
        defer.resolve(response);
        $scope.$apply();  //$rootScope.$apply();
    });
    return defer.promise;
 };

$scope.mymethod = function(){
    $scope.globalMydata[];
    console.log("before the http get");
    $scope.connect("MY_URL").then(function(data) {
         console.log("called!", data);
         console.log("INSIDE the http get");
         $scope.mydata = data;
         //$scope.globalMydata.push(data);            
    });
     console.log("after the http get ");
    //do some processing of the returned data here
    var dataHolder = $scope.mydata;
    return calculatedValue;//value from procesing

}

コードが実行されると、「INSIDE the http get」が最後のデバッグ ログとして呼び出されます。get 呼び出しから結果を取得しますが、後で返されるため、処理を行うことができません。これが私たちが約束する正確な理由ですよね?コントローラー内で何らかの処理を行うには、約束されたデータが必要です。

私の約束の実装に問題はありますか??

4

1 に答える 1

1

あなたの質問を受け取ったかどうかはわかりませんが、promise インターセプターを作成したように見えますが、あなたの質問からは、通常の promise の動作だけが必要なようです。だから私はそれを試してみます..

私は角度の専門家ではありませんが、$http の約束をたくさん使用しています。

次のように、$http 呼び出しをサービスとして登録します。

app.service('ajax',function(host,$http){
  this.post = function(api,data,cb){
    $http.post(host + api,data).success(cb)
  };
  this.get = function(api,cb){
    $http.get(host + api).success(cb)
  }
});

host は事前定義されたmodule.valueです。このサービスを、http リクエストを呼び出して次のように操作する必要があるすべてのコントローラーに挿入します。

ajax.post('users', UserToken, function(data){
  console.log('Users points: ' + data.points)
})

私が理解しているように、$http にはプロミスが組み込まれているため、q と defere は必要ありません。すべてバックグラウンドで行われます。に送信するajax.postサービスを呼び出します。サーバー側はトークンでユーザーを検索し、 の名前の 1 つのキーとユーザー ポイントの値を持つデータを返します。クライアント側: サーバーからの応答が成功すると、コンソールがユーザー ポイントをログに記録する関数に進みます。datahost + 'users'pointscb

したがって、サーバーからの応答が成功する前に呼び出されないため、その cb 関数内の promise に必要な変更を行うことができます。

successメソッドとerrorメソッドにはさらにいくつかのオプションの引数があります。ここで確認してください

于 2013-09-05T07:57:53.337 に答える