Asynchronous 异步JavaScript:未定义值的问题
我必须编写一个函数来接收json,循环到其中,从中获取一些值以向api发出axios请求,从api响应中获取一些参数并将其添加到输入中接收的json中。以下是当前代码: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
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
集成到代码中。我要做些实验。