2012-02-21 16 views
7

के साथ लूप के लिए इटेटरेटर के साथ कैसे काम करें I कॉल के फ़ंक्शन का उपयोग करने वाले I के मान तक पहुंचने के लिए लूप के लिए प्रयास कर रहा हूं।जावास्क्रिप्ट - कॉलबैक

मैं यह कैसे कर सकता हूं?

for (var i = 0; i < a.length; i++) 
{ 
    calcRoute(fixedLocation, my_cities[i].address, function(response) { 

     // i want here to have the current "i" here 

    });    
} 

जो कहता है ...

function calcRoute(x, y, callback) { 

    var start = x; 
    var end = y; 

    var request = { 
     origin:start, 
     destination:end, 
     travelMode: google.maps.TravelMode.DRIVING, 
     unitSystem: google.maps.UnitSystem.METRIC, 
     optimizeWaypoints: true 
    }; 

    directionsService.route(request, function(response, status) { 
     if (status == google.maps.DirectionsStatus.OK) { 
      callback(response);                 
     } else { 
      alert("City unknown.") 
     }  
    }); 
} 

उत्तर

12

यह क्योंकि बंद चर i ही है, नहीं वर्तमान मान लिया गया है। प्रयास करें:

for (var i = 0; i < a.length; i++) (function(i) 
{ 
    calcRoute(fixedLocation, my_cities[i].address, function(response) { 

     // i want here to have the current "i" here 

    });    

}) (i); 

जो प्रत्येक पाश यात्रा के लिए एक नया i चर पैदा करेगा।

1
for (var i = 0; i < a.length; i++) { 

    function createCallback(i) { 
    return function(response) { 
     // i want here to have the current "i" here 
    } 
    } 

    calcRoute(fixedLocation, my_cities[i].address, createCallback(i)); 
} 
2

शायद यह करने के लिए सबसे खूबसूरत तरीका सिर्फ Array.forEach उपयोग कर रहा है:

a.forEach(function(someA, i) { 
    calcRoute(fixedLocation, my_cities[i].address, function(response) { 

     // i want here to have the current "i" here 

    }); 
}); 

कॉलबैक फ़ंक्शन पारित हो: वर्तमान तत्व

  1. वर्तमान सूचकांक
  2. सरणी जिसे इसे
  3. पर बुलाया गया था

तर्क छोड़ने का मतलब है कि आप कॉलबैक में उन्हें एक्सेस नहीं कर सकते हैं। (अक्सर आप इंडेक्स छोड़ देते हैं और केवल मौजूदा तत्व का उपयोग करते हैं)।


तो a एक NodeList, जो forEach नहीं है, बस कार्य करें:

Array.forEach.call(a, function(someA, i) { ... } 
संबंधित मुद्दे