在 node.js 中返回延迟嵌套承诺
return a delayed nested promise in node.js
我在代码中使用谷歌地理编码。我必须对大约 50 个地方进行地理编码,但是谷歌不允许同时对这么多地方进行地理编码,从而产生"OVER_QUERY_LIMIT"错误。所以我想在超过配额时将地理编码延迟几秒钟。我有一个返回promise
的函数geocode()
。当我超过配额时,我想递归调用自己。
这是我的不工作代码:
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()
我找到了它
您的代码似乎工作正常。 我在您的代码中看到的唯一问题是您使用lat
并且lng
超出范围。 但是你可能写得正确,只是没有包含代码。 我怀疑您可能错误地使用了这两个。 这些应该geoData.lat
和geoData.lng
吗?
var coord = { 'lat': geoData.lat, 'lng': geoData.lng };
普罗提
编辑
我认为您的问题可能与您的geocodeAll
函数实现有关。
function geocodeAll(addresses)
{
for (addr in addresses)
{
geocode(addresses[addr]) /* This seems error prone to me! Try keeping track of all your promises.*/
.then(
function(coord)
{/*You only get here if there was no error returned from the geo request to the api. */}
)
}
}
使用Q.all
进行跟踪,
function geocodeAll(addresses) {
var promises = addresses.map(geocode);
for (addr in addresses) {
promises.push(
geocode(addresses[addr])
.catch(console.log.bind(console)) /* handle your error however you see fit*/
);
}
return Q.all(promises).then(function(results) {
var firstCord = results[0];
var secondCord = results[1];
//etc...
});
}
或者,您还可以使用Q.allSettled
处理成功/失败
function geocodeAll(addresses) {
var promises = addresses.map(geocode);
return Q.allSettled(promises).then(function (results) {
var success = [], fail = [];
results.forEach(function (result) {
if (result.state === "fulfilled") {
success.push(result.value);
} else {
fail.push(result.reason);
}
});
return { coords: success, errors: fail };
});
}
});
代码看起来不错。也许geocoder.geocode
或其他原因出错了。尝试设置:
window.onerror = (err) => console.error(err)
或:
process.on('uncaughtException', (err) => console.error(err))
相关文章:
- 用嵌套函数和默认函数定义函数
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 可以简化嵌套的延迟Q Promises解析吗
- 用于搜索的聚合物嵌套绑定
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- d3中堆栈函数和嵌套函数之间的差异
- 如何打印嵌套对象的所有值
- JavaScript 中的嵌套函数和 “this” 关键字
- 设置嵌套对象属性的更好方法
- jQuery通过嵌套的ajax调用延迟对象
- Javascript for 循环中的嵌套延迟
- 嵌套的 AJAX 调用列表和 $.when.apply - 延迟承诺无法正常工作
- 在 node.js 中返回延迟嵌套承诺
- 为什么延迟的“then”回调在嵌套的 AJAX 的成功回调之前触发
- 从延迟嵌套函数返回值
- 如何在最里面的循环等待响应时延迟嵌套迭代
- 如何延迟迭代嵌套对象
- 使用延迟交换嵌套循环中的数组元素
- 如何处理嵌套的jquery延迟调用
- 在YDN-DB事务中嵌套延迟