Вернуть массив после l oop async - PullRequest
0 голосов
/ 20 февраля 2020

Я знаю, что решением моей проблемы являются обещания, но я совсем не понимаю, как применить это к тому, что я хочу сделать ... Можете ли вы помочь мне, не посылая меня на курсы по обещаниям в javascript?

спасибо тебе

function getPosition (workers) {
    let counter = 0
    let allResult = []
    _.forEach(workers, (n) => {
        let firstname = n.firstname
        let lastname = n.lastname
        let streetname = n.address.streetname
        let city = n.address.city
        let country = n.address.country
        axios.get('https://api-adresse.data.gouv.fr/search/?q=' + streetname + ' ' + city)
            .then(response => {
                let lon = response.data.features[0].geometry.coordinates[0]
                let lat = response.data.features[0].geometry.coordinates[1]
                let finalResult = {
                    firstname: firstname,
                    lastname: lastname,
                    address: {streetname: streetname, country: country, city: city, lon: lon, lat: lat}
                }
                logger.info('Longitude and latitude was found for ' + firstname + ' ' + lastname)
                counter++
                allResult.push(finalResult)
                if (counter === workers.length) {
                    return(allResult)
                }
            })
            .catch(error => {
                logger.error(error)
            })
    })
}

Я просто хочу вернуть 'allresult' ... спасибо за вашу помощь

1 Ответ

2 голосов
/ 20 февраля 2020

Вы не можете реально вернуть обещание, вы можете вместо этого выполнить его следующим образом:

function getPosition(workers) {
    return Promise.all(workers.map(worker => {
        const {firstname, lastname, address: {streetname, city, country}} = worker;
        return axios.get(`https://api-adresse.data.gouv.fr/search/?q=${streetname} ${city}`)
            .then(response => {
                const [lon, lat] = response.data.features[0].geometry.coordinates;
                return {
                    firstname: firstname,
                    lastname: lastname,
                    address: {streetname, country, city, lon, lat}
                };
            })
            .catch(logger.error)
    })).then(results => results.filter(Boolean));
}

И получить доступ к результатам в виде

getPosition(workers)
    .then(allResults => {
        // do what you need with the results
    })

Или, альтернативно, с помощью асинхронного Синтаксис / ожидание

(async ()=>{
    const allResults = await getPosition(workers)
    // do what you need with the results
})()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...