Использование закрытия Javascript для передачи дополнительных данных в функцию обратного вызова API - PullRequest
1 голос
/ 01 марта 2012

Я немного поработал, но, похоже, не могу понять, какой будет точная формулировка для получения цикла for для передачи правильного значения.

for(i=0; i < the_stores.length; i++) {
    uid = the_stores[i].id;

    // get the lat long and write info to the console
    geocoder.getLatLng(the_stores[i].address, function(point) { return callbackFunc(point, uid); });
}

function callbackFunc(point, myID) {
    if(point !== null) {
        console.log(point.toString());
        console.log(myID);
    } else {
        return false;
    }
}

Я использую Google Maps API, v2. Я хочу, чтобы цикл for передавал различное значение uid функции обратного вызова для каждой итерации цикла, но сейчас он каждый раз передает одно и то же значение. Кто-нибудь знает, как получить желаемый эффект здесь? Я чувствую, что я довольно близко. Спасибо!

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Вот почему мне так нравится Array.forEach(). Он позаботится обо всех этих типичных проблемах с петлями для вас. Используйте это так:

the_stores.forEach(function (store, i) {
    geocoder.getLatLng(store.address, function(point) {
        return callbackFunc(point, store.id);
    });
}

Array.forEach() является родным JavaScript в современных браузерах, но для IE8 и IE7 вам нужно добавить его самостоятельно. Я рекомендую использовать реализацию , предоставленную MDN . По моему скромному мнению, шайба JS5, включающая, по крайней мере, все новые методы Array, должна быть основой для любого веб-сайта.

1 голос
/ 01 марта 2012

То, что вы ищете, это «Выражение немедленного вызова функции». Поскольку JavaScript имеет только область действия функции, а не область блока, все ссылки на uid связаны с одной и той же переменной.

(Подробнее см .: http://benalman.com/news/2010/11/immediately-invoked-function-expression/)

Вот простой способ сделать это:

for(i=0; i < the_stores.length; i++) {
  (function() {
    var uid = the_stores[i].id;

    // get the lat long and write info to the console
    geocoder.getLatLng(the_stores[i].address, function(point) { return callbackFunc(point, uid); });
  })();
}
1 голос
/ 01 марта 2012

Используйте ваш callbackFunc для возврата обработчика, который ссылается на значения, которые необходимо сохранить.

for(i=0; i < the_stores.length; i++) {

    // get the lat long and write info to the console
    geocoder.getLatLng(the_stores[i].address, callbackFunc(the_stores[i].id));
}

function callbackFunc(myID) {
    return function(point) {
        if(point !== null) {
            console.log(point.toString());
            console.log(myID);
        } else {
            return false;
        }
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...