最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

的NodeJS:如何设法率请求的数量限制到服务器时使用的异步 AWAIT

运维笔记admin6浏览0评论

的NodeJS:如何设法率请求的数量限制到服务器时使用的异步/ AWAIT

的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.getTimeundefined

用一个普通函数:

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)
发布评论

评论列表(0)

  1. 暂无评论