失败时如何重新运行javascript承诺?

时间:2014-11-20 15:35:44

标签: javascript promise google-geocoding-api

我有以下代码,我尝试使用Google Maps Geocoding API将businesses数组中的10-15个地址列表转换为lat / lng坐标。

var geocoder = new google.maps.Geocoder();

var proms = businesses.map(function(address) {
    return prom = new Promise(function(resolve) {
       geocoder.geocode({
            address: address
        }, function(results, status) {

            if (status === google.maps.GeocoderStatus.OK) {
                resolve({
                    results: results,
                    business: address
                });

            } else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                setTimeout(function() {
                    //HOW DO I RE-RUN THIS "new Promise"?
                }, 1000);

            } else {
                console.log(status + ': ' + results);
            }

        });
    });
});
Promise.all(proms);

问题是Google的API有时会返回OVER_QUERY_LIMIT错误,所以我想知道是否有办法重新运行几秒钟后失败的承诺。在上面的示例中,else if语句捕获错误,因此如何在超时后重新运行它?

请注意,我刚刚开始使用承诺,并且没有很好地了解它们是如何工作的,所以我的方法可能完全错误。所有这一切都是在假设谷歌的API不能让我批量解析地址的情况下完成的,如果情况并非如此 - 请告诉我。

2 个答案:

答案 0 :(得分:2)

您可以将代码主体放入函数中,然后再从计时器中调用它。注意:这在技术上不是重新运行一个承诺,而是重新运行一段代码,然后在完成时解析承诺:

var proms = businesses.map(function(address) {
    return prom = new Promise(function(resolve, reject) {
        var retriesRemaining = 5;
        function run() {
            geocoder.geocode({
                    address: address
                }, function(results, status) {

                    if (status === google.maps.GeocoderStatus.OK) {
                        resolve({
                            results: results,
                            business: address
                        });

                    } else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                        --retriesRemaining;
                        if (retriesRemaining <= 0) {
                            reject(status);
                        } else {
                            setTimeout(run, 1000);
                        }
                    } else {
                        console.log(status + ': ' + results);
                    }

                }
            });
        }
        run();
    });
});
Promise.all(proms);

仅供参考,我还添加了重试次数,因此代码永远不会陷入错误循环。

您可能也对这篇文章感兴趣:How to avoid Google map geocode limit?

答案 1 :(得分:-1)

有一次我遇到这个错误是因为我发送请求太快,在每个请求之间等待一秒钟。