2013-06-21 8 views
33

私はループで約束しており、いくつかのスコープ変数を約束ハンドラに渡す方法はわかりません。ループ内で約束する変数を渡す

for(var i in superarray){ 
    MyService.get(superarray[i].externalID).then(function(r){ 
     console.debug(i); 
}); 

MyServiceは、約束を返すgetメソッドを持つ作業サービスです。

app.factory('MyService', function($http,$q) { 
    return { 
    get : function(itemID){ 
     var deferred = $q.defer(); 
     $http.get('/someresturl/'+itemID).then(function(e) { 
       deferred.resolve(e.data); 
     }, function(reason) { 
       deferred.reject(reason); 
     }); 
     return deferred.promise; 
    } 
}); 

私のコンソールでは、console.debug logicalyは1,2,3,4,5を表示しません。しかし、5,5,5,5,5。 (私のスーパーアレイには5つの要素があります)。

私は約束の範囲で '私'の価値を渡すことができますので、then()でそれを使用できますか?

可能ですか?

+6

「取得」機能が不必要に複雑であることを指摘しておく必要があります。次のように置き換えることができます:get:function(itemID){return $ http.get( '/ someresturl /' + itemID); } –

答えて

69

一つの方法は、閉鎖にiをキャプチャすることです:

for(var i in superarray) { 
    (function(i) { 
     MyService.get(superarray[i].externalID).then(function(r) { 
      console.debug(i); 
     }); 
    })(i); 
} 

もう一つの方法は、itemIDのように戻って繰り返すように手配することですrのプロパティ:

for(var i in superarray){ 
    MyService.get(superarray[i].externalID).then(function(r) { 
     console.debug(r.itemID); 
    }); 
}; 
+0

(function(i){})(i)の構文を得ることができるリンク。詳細? – Ant

+0

私は何かを見つけることができるかどうか分かります。 –

+4

@Cooluhuru:あなたは無名関数( 'function(i){}'ビット)を作成しています。最初の議論。あなたは外側のスコープから 'i'をシャドーイングするので、参照ではなく値で' i'を渡します。 – Blender

15

コールバックが実行されるまでに、iは配列の最後の要素を参照します。あなたはクロージャを使用してiの現在値をキャプチャすることができます。

for (var i in superarray){ 
    (function(j) { 
     MyService.get(superarray[j].externalID).then(function(r) { 
      console.debug(j); 
     }); 
    })(i); 
} 
5

あなたは内蔵のを使用して、コードを少し簡略化することができます:

+1

angular.forEachを使用しても動作します –

3

私は受け入れられた解決策にコメントしただけですが、現在のところ十分な評判はありません。

itemIDをrのプロパティとして返す2番目の解決策は、うまくいくと思います。

シンプルな約束ハンドラ:返されたオブジェクトのプロパティとしてITEMIDを返す

angular.module('myApp', []).run(['MyService', function(MyService) { 
    superarray = [1, 2, 3, 4, 5]; 


    for(var i in superarray) { 
    MyService.get(superarray[i]).then(function(returned) { 
     console.log(returned.id); 
    }); 
    } 

}]); 

たMyService:ここ

angular.module('myApp') 
.factory('MyService', function($http,$q) { 
    return { 
    get : function(itemID){ 
     var deferred = $q.defer(); 

     $http.get('www.google.com').then(function(e) { 
       var returnObject = { 
        'data': e.data, 
        'id': itemID 
       }; 
       deferred.resolve(returnObject); 
     }, function(reason) { 
       deferred.resolve(reason); 
     }); 
     return deferred.promise; 
    } 
}}); 

は、実施例on plnkrです。