将响应值存储到全局对象中。成功但没用

问题描述 投票:1回答:2

我无法真正理解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])
}

这里:here it come:

但是当我改变方式时。

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 object asynchronous fetch
2个回答
1
投票

JavaScript正常同步运行。在第3种情况下,您收到空对象是因为fetch调用是异步调用,即为什么dosth(myobj)在您的fetch调用完成之前被调用并会给您响应。因此,最好在接收响应数据的dosth(myobj)调用的响应块内调用fetch,否则该对象将为空。

原因:

> {} //empty object. =>它来自您的第一行,即let myobj = {}> undefined=>关于data["0"],数据是没有属性的空对象。


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"])
    }
© www.soinside.com 2019 - 2024. All rights reserved.