我的目标
使用.map对大型数组进行迭代,并以承诺的方式查询。
使用Promise.all在完成时将结果写入.json文件。
代码是为节点编写的,数组是结构化的[[key:value],[key:value],....。
我写的东西
var foo = (function() {
let promises = airports.map(function(airport) {
return geocoder
.geocode(airport[1])
.then(function(res) {
let x = {
ident: airport[0],
address: res[0].formattedAddress,
lat: res[0].latitude,
long: res[0].longitude
};
return x;
})
.catch(function(err) {
console.log(err);
});
});
return Promise.all(promises)
.then(function(promises) {
console.log("promises resolved");
fs.writeFile(
path.join(__dirname, "/airports.json"),
JSON.stringify(promises),
"utf-8",
function(err) {
if (err) throw err;
console.log("Done!");
}
);
})
.catch(function(err) {
console.log(err);
});
})();问题所在
对于一个小数组(200左右),代码可以很好地工作,但我需要的不仅仅是这些。我认为这是api速率限制的一个问题,因为代码可以执行几百次迭代,然后返回大量ETIMEDOUT错误。
是否有一种方法可以减慢地图的迭代速度,即每秒一次,这与调用多个承诺有什么关系呢?
我认为这将阻止我正在获得的许多ETIMEDOUT错误。
谢谢。
发布于 2017-11-05 03:20:12
这应该将请求限制为每秒1次。
var foo = (function() {
var delay = 1000; // sets the rate
return airports.reduce((promise, airport) => promise
.then(results => new Promise(resolve => setTimeout(resolve, delay, results)))
.then(results => geocoder
.geocode(airport[1])
.then(function(res) {
let x = {
ident: airport[0],
address: res[0].formattedAddress,
lat: res[0].latitude,
long: res[0].longitude
};
return results.concat(x);
})
.catch(function(err) {
console.log(err);
})
), Promise.resolve([])
).then(function(promises) {
console.log("promises resolved");
// ... etc
})
})();https://stackoverflow.com/questions/47117686
复制相似问题