Почему я не могу сохранить эти элементы в массив в jquery

0

Я думаю, что в этом коде есть проблема с областью, но я пытаюсь сохранить значения, возвращаемые функцией обратного вызова геокода, в массив полилинии, но когда я запускаю console.log, массив пуст.

var addPolyline = function(map, line) {

        var polyline = [];

        $.each(line, function(index, address){

            geocode(address, function(latlng){
                polyline.push(latlng);
                console.log(polyline);
            });

        });

        console.log(polyline);
    }

Может кто-нибудь рассказать мне, как я могу добавить элементы из функции обратного вызова в массив? благодаря

Изменить: точки добавляются в массив полилинии, но console.log (полилиния) выполняется до завершения $.each. Мне нужно выяснить, как подождать, пока он не закончится.

Edit2: Один ответчик сказал использовать обратные вызовы. Я попробовал это со следующим кодом, но callback (полилиния) все еще выполняется до того, как закончится $.each.

    var addPolyline = function(map, line) {

        formatPolyline(line, function(polyline){
            console.log(polyline);
        });
    }

    var formatPolyline = function(line, callback) {

        var polyline = [];

        $.each(line, function(index, address){

            geocode(address, function(latlng){
                polyline.push(latlng);
                console.log(polyline);
            });

        });

        callback(polyline);
    }
Теги:

1 ответ

2
Лучший ответ

геокод является "неблокирующим" или "асинхронным", что означает, что программа продолжит выполнение до завершения геокода. Вот почему console.log(polyline) регистрирует пустой массив.

Решение заключается в использовании обратных вызовов.

В приведенном ниже коде используется счетчик, который увеличивается при каждом обратном вызове геокода. При последнем вызове геокода; вызывается функция myCallback, в которой вы можете поместить любой код, который вам нравится.

var addPolyline = function(map, line) {

    var polyline = [],
        total = $(line).length,
        count = 0,
        myCallback = function(){
            console.log(polyline);
        };

    $.each(line, function(index, address){
        geocode(address, function(latlng){
            polyline.push(latlng);
            count++;
            if(count === total){
                myCallback();
            }
        });
    });
}
  • 0
    Я обновил свой ответ с помощью метода обратного вызова, и он все еще не работает. не могли бы вы привести пример?
  • 0
    Я обновил свой ответ с примером кода.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню