我正在玩REST API只是为了更深入地了解它。我在过去几天一直在研究的是“如何从.onLoad()JSON响应中提取数据并将其分配给全局变量?”巧合的是,我找到了关于回调函数的文章。在我询问StackOverflow之前,我决定自己解决这个问题。这就是事情。
我启动了正常的程序来从星球大战API提供商处获取数据。然后我创建了一个函数,它将响应行星数据并将其分配给全局变量(如行星名称,气候和直径)。这些变量将是THREE.js中3Dobject的数据提供者,它将指示行为。我不想尝试将整个THREE.js代码放入.onload()函数中,因为我认为这会在以后造成很多混乱。瞧!现在我在全局变量中拥有了我想要的所有数据,我可以开始关注webApp的下一部分,但是......我所做的是解决这个问题最有效的方法吗? takeOut()函数还有那种回调函数吗?即使我没有将此作为.onload()函数的参数?就像request.onLoad(takeout)一样?
//instance of request obj
var request = new XMLHttpRequest;
//open connection and GET data
request.open("GET", "https://swapi.co/api/planets/2/", true);
//working with data respond
request.onload = function(){
data = JSON.parse(this.response);
return takeOut(data.name, data.climate, data.diameter);
}
//send a request for data
request.send();
//function to take out data from JSON response
var name;
var climate;
var diameter;
function takeOut(x,y,z){
name = x;
climate = y;
diameter = z;
return name, climate, diameter;
}
我希望JSON响应将行星对象名称,气候和直径分配给全局变量作为另一个函数的数据提供者。拉出函数并将所有数据分配给var,但它是否有效?是否有更快,更少“耗时”的方法?我可以使用.onLoad()内部的XMLHttpRequest方法以某种方式执行此操作而不创建单独的函数,仅用于拉出并将数据分配给变量吗?
在你的代码中,takeOut实际上不是一个回调函数。回调函数是一个函数,它作为参数传递给另一个在调用范围上具有闭包的函数(因此访问调用范围中存在的变量)。
使其可重用并使用回调函数:
function retrieveData(cb){
//instance of request obj
var request = new XMLHttpRequest;
//open connection and GET data
request.open("GET", "https://swapi.co/api/planets/2/", true);
//working with data respond
request.onload = function(){
data = JSON.parse(this.response);
return cb(data);
}
//send a request for data
request.send();
}
retrieveData(function(data){
//access data.name; data.climate
})