Простая длина массива — всегда 0, даже если содержимое присутствует

Я столкнулся с какой-то глупой проблемой, из-за которой я знаю, что мне чего-то не хватает.

У меня есть пустой массив, в который я нажимаю материал, используя метод .push().

Теперь, когда я печатаю полный массив, я получаю значения, но когда я использую array.length, он всегда равен нулю. Я знаю, что это очень глупо, чего мне не хватает.

var markersToPush = [];

for (var i = 0; i < contactList.length; i++) {
    console.log('conatcat addres', contactList[i].MailingStreet);
    geocoder.geocode({
        'address': contactList[i].MailingStreet
    }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            map.setCenter(results[0].geometry.location);
            var marker = new google.maps.Marker({
                map: map,
                position: results[0].geometry.location
            });
            markersToPush.push(marker.getPosition());
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}
console.log('markers to push-->', markersToPush);
console.log('markers length-->', markersToPush.length);

Для результата в журнале -

введите здесь описание изображения

Я уже проверил другие связанные проблемы -

  1. Массив Javascript возвращает длину как 0 всегда, даже если в нем есть элементы
  2. Массив Javascript возвращает длину как 0 всегда, даже если в нем есть элементы
  3. Длина массива возвращает 0

person Kaushik Ray    schedule 17.07.2016    source источник
comment
Пожалуйста, разместите свой код здесь   -  person Andrew Li    schedule 18.07.2016
comment
добавлены соответствующие части кода   -  person Kaushik Ray    schedule 18.07.2016
comment
Пожалуйста, размещайте код в виде текста, а не изображения кода. В любом случае, я думаю, вы обнаружите, что массив пуст во время его регистрации, но в нем есть данные к тому времени, когда вы развернете его в консоли. (Если вы зарегистрируете JSON.stringify(markersToPush), это подтвердит это.) Вы вызываете асинхронную функцию geocoder.geocode(), и функция обратного вызова, которую вы ей передаете, не будет вызываться с данными до тех пор, пока цикл не завершится и после операторов console.log(). См. этот вопрос.   -  person nnnnnn    schedule 18.07.2016
comment
Проверьте ключи в файле array(10). Они числовые?   -  person Will    schedule 18.07.2016
comment
добавлен расширенный снимок лога   -  person Kaushik Ray    schedule 18.07.2016
comment
У меня оба журнала консоли выходят за рамки асинхронной выноски. первый журнал показывает результат второй журнал показывает нулевое значение   -  person Kaushik Ray    schedule 18.07.2016
comment
Похоже, вы выводите не свойство length, а скорее свойство size.   -  person Boaz - CorporateShillExchange    schedule 18.07.2016
comment
Я пробовал несколько вещей. Но я пробовал оба и не работал. Обновленный вопрос   -  person Kaushik Ray    schedule 18.07.2016
comment
Обратите внимание на то, что указал @nnnnnn. Все остальные, задающие вопросы, игнорируют тот факт, что это асинхронный запрос. Вы не можете сосчитать то, что еще не доставлено   -  person charlietfl    schedule 18.07.2016
comment
@nnnnnn, charlietfi У меня оба журнала консоли выходят за рамки асинхронного режима. Первый консольный журнал дает результат, второй дает 0 размер. Так что это не должно быть проблемой асинхронности, если я не ошибаюсь   -  person Kaushik Ray    schedule 18.07.2016
comment
Но консоль обновляется после попытки получить длину. Консоль не снимок....там наследуются объекты   -  person charlietfl    schedule 18.07.2016
comment
Чтобы увидеть эту проблему с консолью, измените то, что у вас снаружи, на: console.log('markers to push-->', markersToPush.toString());, и вы увидите снимок, и он должен быть пустым.   -  person charlietfl    schedule 18.07.2016
comment
Да, вы оба правы насчет асинхронности.   -  person Kaushik Ray    schedule 18.07.2016
comment
Теперь проблема в том, что асинхронный вызов происходит внутри цикла for. и после завершения цикла for мне нужно выполнять такие функции, как setbound и т. д., которые я не хочу выполнять при каждом асинхронном вызове.   -  person Kaushik Ray    schedule 18.07.2016
comment
@KaushikRay вы должны, вот как делается асинхронное кодирование. Вы можете обернуть весь остальной код обработки в функции и вызвать их внутри   -  person charlietfl    schedule 18.07.2016
comment
Да.. на самом деле это немного грустно. так как весь этот код в любом случае вызывается в другом асинхронном вызове. Возможно, нужно использовать какое-то обещание разрешения по массе от углового или подобного .. !! Но спасибо за помощь..   -  person Kaushik Ray    schedule 18.07.2016


Ответы (1)


@nnnnnn, скорее всего, прав в своем комментарии. Похоже, вы делаете асинхронный вызов geocoder.geocode(). Вы должны попробовать вести журналы консоли внутри функции обратного вызова:

var marker = new google.maps.Marker({
                map: map,
                position: results[0].geometry.location
            });
            markersToPush.push(marker.getPosition());

            // log the length value here
            console.log('markers length-->', markersToPush.length);
        } else {

Причина, по которой вы видите Array(10) при регистрации объекта, заключается в том, что браузер обновляет буфер. Вы можете попробовать использовать slice(), чтобы заставить это в консоли с вашим текущим кодом, например:

console.log('markers length-->', markersToPush.slice().length);

Это создаст новый массив и измерит длину. Но на самом деле вы должны выполнять всю свою работу в асинхронной функции обратного вызова.

person chris    schedule 17.07.2016
comment
Вы пытаетесь делать журналы консоли внутри функции обратного вызова. Это снаружи - person Kaushik Ray; 18.07.2016
comment
позвольте мне попробовать внутри асинхронного вызова - person Kaushik Ray; 18.07.2016
comment
@KaushikRay, но вам нужно получить длину внутри - person charlietfl; 18.07.2016
comment
Верно, извините, я имел в виду, что стоит попробовать. Переместите журналы консоли в функцию обратного вызова (после того, как вы сделали push) и посмотрите, выводит ли она то, что вы ожидаете. - person chris; 18.07.2016
comment
Я думаю, вы правы, и внутри асинхронного вызова кажется, что он получает правильную длину. Все еще нужно выяснить, где в этом случае размещается остальная часть кода. - person Kaushik Ray; 18.07.2016