繁体   English   中英

为什么我的间隔基于推送到数组会返回不同的结果?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM