【发布时间】:2019-12-16 10:10:52
【问题描述】:
我发生了一件非常奇怪的行为。我有一个 csv 文件,我需要对其进行地理编码。它有 250 行。谷歌地理编码 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);
}
【问题讨论】:
-
这条线
if(rows.length < 1 && processing === 0)是否可能与行移动的速度不同步(在您的情况下为50ms)?也许不是使用interval,而是从geocode函数的回调中调用locationLoop... -
哦,我真的很喜欢。优雅得多。 ty :)
-
仅查看何时获得所有结果而不是根据输入数组为空来完成可能要简单得多。然后,您就不会受到仍在处理中的一些请求的影响。
-
另外,你的错误处理需要更新你所有的状态变量。
标签: javascript node.js google-maps