的NodeJS:如何设法率请求的数量限制到服务器时使用的异步/ AWAIT
我试图使用地理编码API通过限制请求到每秒1次的数量来获得JSON对象。我需要使用异步/等待,这就是我
const requester = {
lastRequest: new Date(),
makeRequest: async (url) => {
var timestart = new Date()
// first check when last request was made
var timeSinceLast = (timestart).getTime() - this.lastRequest.getTime();
if (timeSinceLast < 1000) {
await new Promise(resolve => setTimeout(resolve, timeSinceLast));
}
const response = await fetch(url);
const json = await response.json();
return json;
// make request here and return result
}
};
var requestResponse = requester.makeRequest('/?
locate=Warsaw,Poland&json=1')
有了这个我收到以下错误:
UnhandledPromiseRejectionWarning:类型错误:无法读取的未定义的属性“的getTime”
UnhandledPromiseRejectionWarning:未处理的承诺拒绝。起源或者通过一个异步函数的内部抛没有catch块,或通过拒绝(),将其不与.catch处理一个承诺此错误。 (拒收ID:1)
我试图找到为什么发生这种情况,当只打印请求对象,我没有得到GETTIME()未定义的错误。我使用异步/等待正确的承诺?我究竟做错了什么?
编辑:基于下面的答案,我再也看不到错误,但是我看到的要求经过调节“
const requester = {
lastRequest: new Date(),
makeRequest: async function(url){
var timestart = new Date()
// first check when last request was made
var timeSinceLast = (timestart).getTime() - this.lastRequest.getTime();
if (timeSinceLast < 1000) {
await new Promise(resolve => setTimeout(resolve, timeSinceLast));
}
const response = await fetch(url);
const json = await response.json();
return json;
// make request here and return result
}
};
requester.makeRequest('/?locate=Warsaw,Poland&json=1')
.then(console.log)
这就是我现在看到的:
{ success: false,
error: { code: '006', message: 'Request Throttled.' } }
我需要等待您的答复?
回答如下:Arrow functions don't have this
,所以this.lastrequest.getTime
是undefined
。
用一个普通函数:
const requester = {
lastRequest: new Date(),
makeRequest: async function(url){
var timestart = new Date()
// first check when last request was made
var timeSinceLast = (timestart).getTime() - this.lastRequest.getTime();
if (timeSinceLast < 1000) {
await new Promise(resolve => setTimeout(resolve, timeSinceLast));
}
const response = await fetch(url);
const json = await response.json();
return json;
// make request here and return result
}
};
requester.makeRequest('https://geocode.xyz/?locate=Warsaw,Poland&json=1') //Don't write strings in two lines
.then(console.log)