Asyn c JavaScript: проблема с неопределенным значением - PullRequest
0 голосов
/ 16 февраля 2020

Мне нужно написать функцию, которая получает json, зацикливается на ней, получает от нее какое-то значение, чтобы сделать запрос ios ax к API, получает какой-то параметр из ответа API и добавляет его в json получено на входе. Вот текущий код:


let db_mock = require('../db_mock.json');

function Geolocation(db_mock: any): any {

    for (let i: number = 0; i < db_mock.length; i++) {

        if (db_mock[i].place == null) {
            console.log('ERRORE: Manca l\'indicazione del luogo');
            return;
        }

        for (let j: number = 0; j < db_mock[i].place.length; j++) {
            axios.get(URL)
            .then((response: any) => {
                db_mock[i].place[j] = {
                    city: response.data.Response.View[0].Result[0].Location.Address.City,
                    country: response.data.Response.View[0].Result[0].Location.Address.Country,
                    county: response.data.Response.View[0].Result[0].Location.Address.County,
                    label: response.data.Response.View[0].Result[0].Location.Address.Label,
                    postalCode: response.data.Response.View[0].Result[0].Location.Address.PostalCode,
                    state: response.data.Response.View[0].Result[0].Location.Address.State,
                    position: {
                        latitude: response.data.Response.View[0].Result[0].Location.DisplayPosition.Latitude, 
                        longitude: response.data.Response.View[0].Result[0].Location.DisplayPosition.Longitude 
                    }
                }
            })
            .catch((error: any) => console.log(error))
        }

    }

}

let db: any = Geolocation(db_mock);

// console.log(db);

Проблема заключается в том, что когда я пытаюсь получить измененный json и записать его в консоль, он не определен. Я не могу понять, как обрабатывать этот асин c объект.

Есть предложения?

1 Ответ

0 голосов
/ 16 февраля 2020

Я разобрался, как решить проблему!

Вот мое решение для интересующихся:

function Geolocation(db_mock: any) {

    const promises: any[] = [];

    return new Promise((resolve, reject) => {
        for (let i: number = 0; i < db_mock.length; i++) {

            if (db_mock[i].place == null) {
                reject(new Error("Manca l'indicazione del luogo"));
            }

            for (let j: number = 0; j < db_mock[i].place.length; j++) {
                promises.push(
                    axios.get(`https://geocoder.ls.hereapi.com/search/6.2/geocode.json?searchtext=${db_mock[i].place[j]}&apiKey=${process.env.API_KEY}`)
                    .then((response: any) => {
                        db_mock[i].place[j] = {
                            city: response.data.Response.View[0].Result[0].Location.Address.City,
                            country: response.data.Response.View[0].Result[0].Location.Address.Country,
                            county: response.data.Response.View[0].Result[0].Location.Address.County,
                            label: response.data.Response.View[0].Result[0].Location.Address.Label,
                            postalCode: response.data.Response.View[0].Result[0].Location.Address.PostalCode,
                            state: response.data.Response.View[0].Result[0].Location.Address.State,
                            position: {
                                latitude: response.data.Response.View[0].Result[0].Location.DisplayPosition.Latitude, 
                                longitude: response.data.Response.View[0].Result[0].Location.DisplayPosition.Longitude 
                            }
                        }
                    })
                    .catch((error: any) => reject(new Error(error)))
                )
            }

        }

        Promise.all(promises)
        .then(_ => resolve(db_mock) )
        .catch(err => reject(new Error(err)))
    })

}

Geolocation(db_mock)
.then(res => console.log(res))
.catch(err => console.log(err))

Спасибо пользователю Bergi за помощь!

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