Asynchronous 异步JavaScript:未定义值的问题

Asynchronous 异步JavaScript:未定义值的问题,asynchronous,promise,Asynchronous,Promise,我必须编写一个函数来接收json,循环到其中,从中获取一些值以向api发出axios请求,从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

我必须编写一个函数来接收json,循环到其中,从中获取一些值以向api发出axios请求,从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);

让db_mock=require('../db_mock.json');
功能地理定位(db_mock:any):any{
for(设i:number=0;i{
db_mock[i].地点[j]={
城市:response.data.response.View[0]。结果[0]。位置。地址。城市,
国家/地区:response.data.response.View[0]。结果[0]。位置。地址。国家/地区,
县:response.data.response.View[0]。结果[0]。位置。地址。县,
标签:response.data.response.View[0]。结果[0]。位置。地址。标签,
postalCode:response.data.response.View[0]。结果[0]。Location.Address.postalCode,
状态:response.data.response.View[0]。结果[0]。位置。地址。状态,
职位:{
纬度:response.data.response.View[0]。结果[0]。位置。显示位置。纬度,
经度:response.data.response.View[0]。结果[0]。位置。显示位置。经度
}
}
})
.catch((错误:any)=>console.log(错误))
}
}
}
设db:any=地理位置(db_mock);
//控制台日志(db);
问题是,当我尝试获取修改后的json并将其记录在控制台日志中时,它是未定义的。我不知道如何处理这个异步对象


有什么建议吗?

我想出了解决问题的办法

以下是我为感兴趣的人提供的解决方案:

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))
功能地理定位(db\u mock:any){
const承诺:任意[]=[];
返回新承诺((解决、拒绝)=>{
for(设i:number=0;i{
db_mock[i].地点[j]={
城市:response.data.response.View[0]。结果[0]。位置。地址。城市,
国家/地区:response.data.response.View[0]。结果[0]。位置。地址。国家/地区,
县:response.data.response.View[0]。结果[0]。位置。地址。县,
标签:response.data.response.View[0]。结果[0]。位置。地址。标签,
postalCode:response.data.response.View[0]。结果[0]。Location.Address.postalCode,
状态:response.data.response.View[0]。结果[0]。位置。地址。状态,
职位:{
纬度:response.data.response.View[0]。结果[0]。位置。显示位置。纬度,
经度:response.data.response.View[0]。结果[0]。位置。显示位置。经度
}
}
})
.catch((错误:any)=>拒绝(新错误(错误)))
)
}
}
所有(承诺)
。然后(=>resolve(db_mock))
.catch(err=>reject(新错误(err)))
})
}
地理定位(db_模拟)
.then(res=>console.log(res))
.catch(err=>console.log(err))

感谢用户Bergi的帮助

您的
Geolocation
函数甚至没有
return
语句?当我将return放入时,它会给出错误,如果我将它放在外部,它会返回未修改的json。是的,因为它是异步的,您必须返回对结果的承诺。使用
Promise.all
等待所有并发axios调用,很抱歉,我对异步编程和promises非常陌生,我不知道如何将
Promise.all
集成到代码中。我要做些实验。