【发布时间】:2020-02-02 22:29:44
【问题描述】:
我编写了一段代码来从 API 收集一些美国城市的坐标。
基本上:
- 我有一个大数组(数据),其中包含一些公司信息,由它们所在的美国州组织
- 我创建了一个名为 coords 的空数组
- 我遍历我的大数组,其中所有数据都是为了找到每个州的独特城市
- 对于每个城市,我从 API 获取坐标并将其推送到我的数组 coords 中
- 循环结束后,我控制台记录 coords 数组,它可以工作。
console.log(coords) 不应该只显示一个空数组吗?
当我尝试做任何其他事情时(例如 JSON.stringify),我得到一个空数组(可能是因为循环后代码在承诺解决之前执行?但是为什么不使用 console.log?)
有人可以向我解释一下这种奇怪的行为吗?
// const data = ...allmydata...
let coords = []
const key = 'MYKEY'
for(let state in data){
coords[state] = []
// get the list of unique cities
let cities = [...new Set( data[state].map( x => x['Largest Location'] ) )]
// this is the fetching loop: for each city name
// I'm getting the coordinates asynchronously
cities.forEach( (city) => {
coords[state][city] = {
lat: undefined,
lng: undefined
}
let req = `http://open.mapquestapi.com/geocoding/v1/address?key=${key}&location=${city},${state}`
fetch(req)
.then( res => res.json() )
.then( res => {
coords[state][city]['lat'] = res.results[0].locations[0].latLng.lat
coords[state][city]['lng'] = res.results[0].locations[0].latLng.lng
})
.catch( err => console.log(err) )
})
}
// out of the loop
// this displays my array nicely structured in the console
console.log(coords)
// this displays []
console.log(coords.map(x => x))
// this displays []
console.log(JSON.stringify(coords))
我不认为这是所有关于为什么异步代码中未定义值的问题的重复(我已经阅读了一个公平的份额),这一次值看起来定义了它不应该恕我直言。
提前致谢
【问题讨论】:
-
console.log()被传递一个对对象(或数组)的引用,因此控制台中的值会随着对象的变化而变化.. -
@Rounin 好的,所以如果我理解正确,如果我将一个对象传递给 log 函数,它是一个引用,但如果我传递其他东西,例如JSON.stringify(myObject),然后 js 尝试解释括号之间的内容并将对新结果的引用传递给控制台?
-
差不多,据我所知,是的。如果您记录原始对象,则日志将显示对该对象的可更新引用。如果您记录计算结果,那么它将仅记录该计算的同步结果。 @Evert 下面的回答是一个很好的总结。
-
太好了,谢谢,它似乎已经在参考文献中:developer.mozilla.org/en-US/docs/Web/API/Console/log
标签: javascript loops asynchronous promise console.log