在节点中调节API AJAX请求(获得速率有限) - 使用AXIOS进行AJAX调用...

问题描述:

我正在限制每秒向API提出太多请求。在节点中调节API AJAX请求(获得速率有限) - 使用AXIOS进行AJAX调用...

我正在将联系人导入到我的数据库并将数据映射到我的数据库的模式。

API最初会将其联系人的“组”(即类别)作为链接数组返回,它们都需要单独调用API以检索实际值。

我必须迭代每个联系人并为与每个联系人关联的数组中的每个链接分别调用API。我很快达到了我的费率限制(根据API文档,每秒最多10次),并因此得到一堆不完整的条目和错误。

我正在使用Axios库在Node中创建请求。

我的代码如下 - 任何帮助解决这个困境将不胜感激 - 谢谢!

 .then(authUser => { 

      // RETURN A LIST OF CONTACTS FROM API 

      axios.get('url', { 
       headers: { 
       Authorization: credentials 
       } 
      }) 
      .then(response => { 

       // MAP OVER EACH CONTACT 
       response.data.map(contact => { 

       let groups = contact.groupLinks.map(group => { 

        // MAP OVER EACH LINK IN EACH CONTACTS GROUP ARRAY AND MAKE AJAX REQUEST. 
        return axios.get(`${group.url}/?alt=json`, { 
         headers: { 
         Authorization: 'credentials' 
         } 
        }) 
        .then(result => { 
         return result.data 
        }) 
        .catch(err => { 
         console.error('FETCH GROUP MEMBERSHIP FAILURE', err.response.data.error) 
         next(err) 
        }) 
        }) 

       return Promise.all(groups) 
       .then(response => { 
        return [contact, response] 
       }) 
+0

这里有一个很有希望的功能发布[这里](https://github.com/mzabriskie/axios/issues/230) – James

+0

谢谢,我看到了这个,但它会给它一个旋转,如果它有效的话回来。欣赏回应.... –

我不熟悉AXIOS,所以我不确定这是可能的。当你使用数组/对象映射来让每个组调用它的url时,外部变量将如何被绑定?你能做这样的事吗?

// MAP OVER EACH CONTACT 
 
response.data.map(contact => { 
 
/*right here set an interval 
 
*/ 
 
var interval = 0; 
 
let groups = contact.groupLinks.map(group => { 
 
    //increment interval 
 
    interval += 150; 
 

 
    // MAP OVER EACH LINK IN EACH CONTACTS GROUP ARRAY AND MAKE AJAX REQUEST. 
 
    setInterval(function() 
 
     { 
 
      return axios.get(`${group.url}/?alt=json`, { 
 
      headers: { 
 
      Authorization: 'credentials' 
 
      } 
 
     }) 
 
     .then(result => { 
 
      return result.data 
 
     }) 
 
     .catch(err => { 
 
      console.error('FETCH GROUP MEMBERSHIP FAILURE', err.response.data.error) 
 
      next(err) 
 
     }) 
 
     }, interval); 
 
    })

否则我会移动的组响应,接受该组从API返回的递归函数的处理,进行必要的电话,弹出刚刚称为组,然后调用本身在150毫秒的延迟。

+0

非常感谢您的回复。欣赏它,会尝试一下代码片段,如果它能够正常工作,就会回来...... –

那么,我最终做了一些完全不同的事情,因为事实证明这太复杂和低效。我无法让它工作。

API允许您下载所有用户组的完整列表。 我创建了一个名为'ContactGroups'的新数据库表格

对于联系人,API返回一个包含组ID的数组的对象。

要显示我进行单独的POST请求的API端点呼叫“/ getgroups”与在有效载荷中的组id阵列的基团,并进行以下分贝查询:

ContactGroups.findAll({ 
     where: { 
     groupId: req.body.groups // [this is an array of ids] 
     } 
    }) 

这将返回匹配的数组组。