我正在使用Google地理编码在我的代码中。我需要对大约50个地方进行地理编码,但是Google不允许同时对这么多地方进行地理编码,会生成“OVER_QUERY_LIMIT”错误。因此,当我超出配额时,我想延迟几秒钟进行地理编码。我有一个函数
这是我的不起作用的代码:
geocode()
返回一个promise
。当我超出配额时,我想递归调用自身。这是我的不起作用的代码:
function geocodeAll(addresses)
{
for (addr in addresses)
{
geocode(addresses[addr])
.then(
function(coord)
{/* I don't always get here */}
)
}
}
function geocode(address)
{
var deferred = Q.defer();
geocoder.geocode(address, function ( err, geoData )
{
if (err)
{ deferred.reject(err);}
else
{
if (geoData.status=="OVER_QUERY_LIMIT" )
{ // doh! quota exceeded, delay the promise
setTimeout(function()
{geocode(address)
.then(
function(coord)
{deferred.resolve(coord);}
);
}, 1000);
}
else
{ // everything ok
var coord = {'lat':geoData.lat, 'lng':geoData.lng};
deferred.resolve(coord);
}
}
});
return deferred.promise;
}
更新[已解决]
实际上这段代码是正确的。我有一个未捕获的异常与延迟无关。使用Q.all([..]).then().catch()
,我发现了它。
geocode
和setTimeout
分别转换为Promise。如果您不想这样做,至少使用setTimeout(function() { deferred.resolve(geocode(address)); }, 1000)
来正确处理它。 - Bergi