有一个功能,首先获取环境中的所有区域,然后当他为每个区域找到这些区域时,它将对边界点进行api调用。所有提取均被执行,但问题在于,如果我尝试写出区域的 长度 或尝试执行 .foreach , 则 在第一次提取中,我得到0。
我知道这是因为它运行异步,并且在我执行console.log时尚未加载,但是我应该这样做。这就是为什么我们使用 .then 呢?等待数据加载完毕。
需要明确的是: 我正在寻找一种使zone.length返回对象数组的实际长度并立即被评估而不是从0开始求值的方法。我不知道如何:
这是代码。
getZones(){ var that = this; var zones = new Array(); fetch('api/environment/zone/1').then(function(response){ response.json().then(function(data){ data.forEach(function(element){ zones[element.zoneID] = element; zones[element.zoneID].points = []; fetch('api/zone/point/'+element.zoneID).then(function(response){ response.json().then(function(data){ data.forEach(function(element){ zones[element.zoneID].points.push(element); }); }); //closing of data inner fetch. }); }); }); }).then(function(response){ console.log(zones); //this gives all zones console.log(zones.length); //this one gives 0 //the for each is never executed because it's still 0. zones.forEach(function(element){ console.log(element); }); }); }
快速 响应 和帮助已经非常感谢。
调用fetch返回Promise,即为async。因此,您的第二个.then代码甚至在第一个代码中的代码完成之前就已经执行了,因为,您的第一个然后是contains另一个fetch函数,即异步函数。您可以使用如下所示的逻辑来等待,直到获得所有点数据,然后继续执行逻辑。
fetch
Promise
async
.then
contains
getZones(){ var that = this; // var zones = new Array(); // this function gets called finally. // Do what you want to do with zones and points here. var gotAllZones = function(zones) { console.log(zones); //this gives all zones console.log(Object.keys(zones).length); //this one gives 0 Object.keys(zones).forEach(function(index){ console.log(zones[index]); }); } fetch('api/environment/zone/1').then(function(response){ response.json().then(function(data){ //decleare zones to be a object. Based on your code `zones` is not an array var zones = {}; var pointsDone = 0; // declare how many points api has been completed. Initially its `0` data.forEach(function(element){ zones[element.zoneID] = element; zones[element.zoneID].points = []; fetch('api/zone/point/'+element.zoneID).then(function(response){ response.json().then(function(innerData){ innerData.forEach(function(element){ zones[element.zoneID].points.push(element); }); pointsDone++; //each time we are done with one. we increment the value. // we check if we are done collecting all points data // if so we can call the final function. if(pointsDone === data.length) { gotAllZones(zones); } }); //closing of data inner fetch. }); }); }); }) }