[英]Why is my interval returning different results based on pushing to an array?
我的行为很奇怪。 我有一个需要地理编码的csv文件。 它有250条线。 Google地理编码api每秒有一个速率限制,所以我不能只在每行上写一个for循环。 我选择使用间隔。 我每不到一秒钟便发出api请求,完成后应将结果写入新的csv文件。 但是,无论我做什么,我始终只能获得247个结果。
为了查看中断发生的位置,我设置了一个called
变量,以查看我的地理编码函数被调用了多少次。 确实被称为250次。 然后,我开始将被called
变量更深地移入函数回调,以查看是否被击中250次。 奇怪的是,它确实是,不是。 如果我包括增加called
错误后立即检查它的250,但如果我把它放在下面push
声明它是247。
let called = 0;
/*Handles geocoding via google api*/
function geoCode(obj){
console.log(`${rows.length} items remaining`);
processing += 1;
try {
googleMapsClient.geocode({
address: `${obj.ST_ADDRESS} ${obj.CITY} ${obj.STATE} ${obj.ZIP_CODE} ${obj.COUNTRY}`
}, function(err, response) {
if (!err) {
called +=1; <------------HERE IT'S 250
processing -= 1;
const result = obj;
result.LATITUDE = response.json.results[0].geometry.location.lat;
result.LONGITUDE = response.json.results[0].geometry.location.lng;
results.push(result);
called +=1; <-----------------HERE IT'S 247
if(rows.length < 1 && processing === 0){
// begin writing to file
writeFile(results);
console.log('called', called);
}
}else{
console.log(err);
}
});
}catch (e) {
console.log(e);
}
}
/* Loop through results at sustained pace to prevent rate limiting */
function locationLoop(){
interval = setInterval(()=>{
if(rows.length > 0){
geoCode(rows.shift());
}else{
clearInterval(interval);
}
}, 50);
}
我不确定这个答案是否正确。
检测到250和247之间的代码可能会引发错误。 例如,如果API无法解析坐标,并且response.json.results
包含任何项目。 尝试访问response.json.results[0].geometry
将产生类似can't get geometry of undefined
错误。
该错误将丢失,因为它不是具有try-catch的事件。
因此,对于250个结果中的3个,Google无法解析坐标。
承诺是处理异步代码和失败的好方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.