Заполненный массив имеет длину 0

206
24 марта 2018, 18:15

Здравствуйте, я хочу сделать запрос в запросе. Сначала делаю запрос, получаю от сервера данные, в них имеется адрес в формате долгота/широта, мне нужно из координат получить нормальный адрес. Для этого после получения данных из первого запроса(массив из ~100 объектов) я запускаю метод forEach и делаю запрос на geocode-maps.yandex.ru

export const getProducts = () => async dispatch => {
  dispatch({
    type: GET_PRODUCTS_REQUEST
  });
  try {
    await fetch(API_SERVER_PRODUCTS)
      .then(response => {
        if (response.ok) {
          return response.json()
            .then(products => {
              return products
            })
            .then(async products => {
              const addressArray = [];
              products.data.forEach(item => {
                let lngLatUrl = YANDEX_GEOCODE + 'E' + item.address.lng + ',N' + item.address.lat;
                try {
                  fetch(lngLatUrl)
                    .then(r => {
                      if (r.ok) {
                        return r.json()
                          .then(async address => {
                            addressArray.push(address.response.GeoObjectCollection.featureMember[0].GeoObject.metaDataProperty.GeocoderMetaData.text);
                          })
                      } else {
                        throw new Error('Network response was not ok.(2)');
                      }
                    })
                } catch (err) {
                  console.log('some error with address: ' + err)
                }
              });
              await dispatch({
                type: GET_PRODUCTS_SUCCESS,
                payload: products.data,
                newAddress: addressArray
              })
            })
        } else {
          throw new Error('Network response was not ok.');
        }
      });
  } catch (err) {
    dispatch({
      type: GET_PRODUCTS_FAILURE,
      error: true,
      errorMassage: err
    })
  }
};

Не могу понять, что у меня с адресами получается.

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

В консоле logger показывает, что у меня есть массив с адресами, в консоле вижу, что там 100 строк, но если пишу nameArr.length, то получаю 0 и никак не могу обратиться к элементам по индексу. В redux-devtools-extension вообще показывает, что массив приходит пустой. Мне кажется, что нужно использовать async/await. Но понять не могу как. И вообще не слишком ли мудреный запрос получается? Может можно сделать как-то элегантнее?
Помогите, пожалуйста, мучаюсь уже второй день, думал простая задачка...

UPDATE Пришел к такому решению.. Надеюсь оно верное

               fetch(lngLatUrl)
                .then(r => {
                  if (r.ok) {
                    return r.json()
                      .then(async address => {
                        newProducts[i].addressString = address.response.GeoObjectCollection.featureMember[0].GeoObject.metaDataProperty.GeocoderMetaData.text;
                        if (arr.length === i + 1) {
                          dispatch({
                            type: GET_PRODUCTS_SUCCESS,
                            payload: newProducts
                          })
                        }
                      });
                  } else {
                    throw new Error('Network response was not ok.(2)');
                  }
                })
READ ALSO
Vue обновление computed

Vue обновление computed

У меня есть такие вычисляемые свойства и методы:

164
изменить текст на кнопке

изменить текст на кнопке

Ребят подскажите, нужно при отправке данных, пока форма грузиться , отключить кнопку, инпут файл и изменить текст на кнопкеформа:

226
Как вывести таблицу через console.log?

Как вывести таблицу через console.log?

Подскажите как вывести таблицу в консольК примеру нужно вывести таблицу Пифагора

187
Laravel фильтр по таблице + paginator

Laravel фильтр по таблице + paginator

Имеется таблица в каждом столбце можно производить поиск по колонкеКак это сделать в laravel 5, используя paginator? На мой я придумал велосипед

196