我无法真正理解JS的运行方式。您能为我解释一下吗(至少给我一些关键词)。
fetch("https://opentdb.com/api.php?amount=10")
.then(res => res.json())
.then(res=> {
dosth(res)
})
function dosth(data){
console.log(data)
console.log(data.results[0])
}
但是当我改变方式时。
let myobj = {}
fetch("https://opentdb.com/api.php?amount=10")
.then(res => res.json())
.then(res=> {
for(let i=0;i<res.results.length;i++){
myobj[i]=res.results[i]
}
dosth(myobj)
})
function dosth(data){
console.log(data)
console.log(data["0"])
}
它仍然有效:here
但现在:
let myobj = {}
fetch("https://opentdb.com/api.php?amount=10")
.then(res => res.json())
.then(res=> {
for(let i=0;i<res.results.length;i++){
myobj[i]=res.results[i]
}
})
dosth(myobj)
function dosth(data){
console.log(data)
console.log(data["0"])
}
answerDevTools可以记录整个obj,但不能记录指定的属性。我认为它必须是
> {} //empty object.
> undefined
你能帮我解释一下吗?
JavaScript正常同步运行。在第3种情况下,您收到空对象是因为fetch
调用是异步调用,即为什么dosth(myobj)
在您的fetch
调用完成之前被调用并会给您响应。因此,最好在接收响应数据的dosth(myobj)
调用的响应块内调用fetch
,否则该对象将为空。
原因:
> {} //empty object.
=>它来自您的第一行,即let myobj = {}
> undefined
=>关于data["0"]
,数据是没有属性的空对象。
JavaScript正常同步运行。但是,提取调用是异步调用。
dosth函数应直接用于此后:
let myobj2 = {}
fetch("https://opentdb.com/api.php?amount=10")
.then(res => res.json())
.then(res=> {
for(let i=0;i<res.results.length;i++){
myobj2[i]=res.results[i]
}
dosth(myobj2)// here
})
//dosth(myobj2) not here
function dosth(data){
console.log('ab2',data)
console.log('ab3',data["0"])
}