我使用promises将我的请求限制在客户端Maps Direction API。谷歌的文档说我可以每秒执行10个请求,但我不能这样做,我不知道为什么。
我每3分钟执行18次约20秒的呼叫,并且我每次都在第一轮获得速率限制。
现在很明显,20秒内的18次通话远不到每秒10次。我在读错了信息吗?或误解所有这些是如何工作的?任何帮助都表示赞赏我已经在这里待了太久了。
这是我创建的一个小提琴,用于模拟我正在做的事情:
https://jsfiddle.net/ffauf2bf/1/
我每3分钟拨打一次电话,而不是每分钟拨打18次电话。如果打开控制台,您可以看到每个调用的状态以及调用它的第二个和毫秒。您还会注意到,第一轮通话总是被限制,而每次接下来的一轮通话都是成功的,尽管每一轮通话都没有差异。#/ p>;
我希望这是有道理的!如果您有任何问题,我将很乐意澄清。如果您不想/无法访问jfiddle,我将在下面提供相关代码
const getDistance = async (people, place) => {
await sleep(500);
return new Promise((resolve, reject) => {
let origins = [];
for(let person of people){
origins.push(new google.maps.LatLng(person.lat, person.lng));
}
const destin = new google.maps.LatLng(place.lat, place.lng);
const service = new google.maps.DistanceMatrixService();
service.getDistanceMatrix(
{
origins: origins,
destinations: [destin],
travelMode: 'DRIVING'
}, (res, status) => {
if(status === "OK"){
console.log(
status, `${new Date().getSeconds()}:${new Date().getMilliseconds()}`
);
let result = {id: place.id, distances: []}
res.rows.forEach((row, i) => {
result.distances.push(
{id: people[i].id, distance: row.elements[0].status}
);
});
resolve(result);
} else {
reject(status);
}
}
);
});
}
由以下人员调用:
const findClosest = () => {
return new Promise( async (resolve, reject) => {
let result = [];
for (let place of places){
try {
let distances = await getDistance(people, place);
result.push(distances);
} catch(e) {
reject(e);
}
}
resolve(result);
});
}
答案 0 :(得分:0)
如果有人发现这个,我找到了解决方案。
问题在于我试图限制网络请求的方式。使用这个
const sleep = (ms) => {
return new Promise(resolve => setTimeout(resolve, ms));
}
不正确。通过强制我的代码像这样等待,我看到两个函数可能仍然同时触发的行为。
相反,我转而使用lodash,特别是throttle
函数。
通过这样做
const asyncFunc = _.throttle(asyncFunc, 250);
您保证每250ms不会多次调用该函数。