2013-06-21 6 views
33

में वादा करने के लिए वैरिएबल पास करना मेरे पास एक लूप में एक वादा है, और मुझे नहीं पता कि वादे हैंडलर में कुछ स्कोप चर कैसे पारित करें।एक लूप

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

MyService एक काम सेवा, एक प्राप्त विधि है कि एक वादा वापसी के साथ है।

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 तत्व हैं)।

मैं अपने वादे के दायरे में 'i' मूल्य कैसे पारित कर सकता हूं, इसलिए मैं इसे तब() में उपयोग कर सकता हूं?

क्या यह संभव है?

+6

किसी को आपको यह इंगित करना चाहिए कि आपका "get" फ़ंक्शन अनावश्यक रूप से जटिल है। इसे प्रतिस्थापित किया जा सकता है: प्राप्त करें: फ़ंक्शन (itemID) {$ 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

कोई भी लिंक जहां मैं सिंटैक्स प्राप्त कर सकता हूं (फ़ंक्शन (i) {}) (i); विस्तृत? – Ant

+0

एक पल, मैं देखूंगा कि मुझे कुछ मिल सकता है .... –

+4

@ कुल्लूहुरु: आप सिर्फ एक अज्ञात फ़ंक्शन ('फ़ंक्शन (i) {} 'बिट) बना रहे हैं और इसे' 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

कोणीय .forEach का उपयोग करके भी काम करता है –

3

मैं सिर्फ स्वीकार किए जाते हैं समाधान पर टिप्पणी की है, लेकिन मैं इस समय पर्याप्त प्रतिष्ठा नहीं है।

मुझे लगता है कि आरआई की संपत्ति के रूप में आइटम आईडी को दोहराने का दूसरा समाधान ठीक काम करेगा।

सरल वादा हैंडलर:

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

}]); 

Itemid लौटे वस्तु की एक संपत्ति के रूप में लौटने 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 है।