JavaScript - проблема синхронизации со сторонним API - PullRequest
0 голосов
/ 27 января 2012

У меня проблема с синхронизацией стороннего API.

Кажется, что мой цикл for выполняется быстро, отбрасывая запросы API, которые могут возвращать данные в любом порядке.

Как я могу реструктурировать это так, чтобы DoSomething запускался синхронно?

function startgeocoding() {
    for(var x = 0; x < address2.length; x++ ) {
        geocode(address);
    }
}

function geocode(address) {
    if (geocoder) {                 
        geocoder.geocode({ 'address': address  }, function (results, status) {          
        if (status == google.maps.GeocoderStatus.OK) {
            DoSomething();
        }
    }
}

1 Ответ

2 голосов
/ 27 января 2012

Вы можете вызвать geocode() для следующего элемента в обратном вызове успеха, чтобы создать цепочку вызовов.Вызовы все еще будут асинхронными, но вы не геокодируете следующий, пока не закончится первый.Что-то вроде:

var addresses = [];

// this function really is optional, it's just copying an array
function startGeocoding() {
    for (var x = 0; x < addresses2.length; x++) {
        addresses.push(addresses2[x]);
    }
    geocode(addresses.shift());
}

function geocode(address) {
    if (geocoder){                   
        geocoder.geocode({ 'address': address  }, function (results, status) {          
            if (status == google.maps.GeocoderStatus.OK) {
                DoSomething();
                if (addresses.length > 0) {
                    // take first value
                    geocode(addresses.shift());
                }
            } 
        });
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...