Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 优化分页REST API数据的收集_Javascript_Python_Django_Rest_Celery - Fatal编程技术网

Javascript 优化分页REST API数据的收集

Javascript 优化分页REST API数据的收集,javascript,python,django,rest,celery,Javascript,Python,Django,Rest,Celery,我需要从第三方RESTAPI收集数千条记录,但每次调用最多只能收集99条记录。此外,API不返回有关记录总数或页面计数的任何信息,它只返回布尔值“more_records” 为了收集一个页面的数据,必须进行几百次API调用,这显然是非常缓慢的,这会导致我的一条路由超时。我对优化的第一个想法是将API调用划分为异步任务,但由于除了“更多记录”之外没有停止信息,我不确定如何处理调用这些任务 我用Django做这个,我已经把芹菜做了其他用途。超时的路由收集并处理此数据和其他数据,并将其作为JSON返回

我需要从第三方RESTAPI收集数千条记录,但每次调用最多只能收集99条记录。此外,API不返回有关记录总数或页面计数的任何信息,它只返回布尔值“more_records”

为了收集一个页面的数据,必须进行几百次API调用,这显然是非常缓慢的,这会导致我的一条路由超时。我对优化的第一个想法是将API调用划分为异步任务,但由于除了“更多记录”之外没有停止信息,我不确定如何处理调用这些任务

我用Django做这个,我已经把芹菜做了其他用途。超时的路由收集并处理此数据和其他数据,并将其作为JSON返回以填充一个总报告。我的一个想法是打破这个JSON路由,这样我的gross report的Javascript就可以进行许多较小的API调用并处理数据本身,但这只能解决超时问题,因为任何调用都不会花费太长时间。我所看到的优化响应时间的唯一方法是减少API调用的数量或异步处理它们,而且我认为使用此API进行更少的调用是不可能的

无论如何,我需要帮助设计一个函数来处理异步进行多个API调用和聚合数据,而不知道数据的最后一页在哪里,直到我到达它为止。我可以在Python/Django后端使用芹菜完成异步任务,也可以使用异步JavaScript

我不知道这是否有助于作为起点,但这是我现在拥有的同步功能:

def get_salesiq_records(module:str, access_token:str, parameters:dict={}):
records = []
more_records = True
parameters['index'] = 1
while more_records:
    response = requests.get(
        f'https://salesiq.zoho.com/api/v2/mywebsite/{module}',
        params=parameters,
        headers={'Authorization': 'Zoho-oauthtoken ' + access_token}  )
    if response is None:
        raise CustomException(
            status=status.HTTP_502_BAD_GATEWAY, 
            info='No response from Zoho CRM API / get records.'
        )
    elif response.status_code == status.HTTP_204_NO_CONTENT:
        more_records = False
    else:
        response_data = response.json()
        if response.status_code != status.HTTP_200_OK:
            raise CustomException(
                status = response.status_code,
                info = f'Bad response from Zoho SalesIQ API. Module: {module}',
                details = response_data
            )
        records.extend(response_data['data'])
        # Why can't Zoho APIs at least be consistent within one service?
        if module == 'conversations':
            more_records = response_data['more_data_available']
            parameters['index'] += parameters.get('limit', 20)
        elif module == 'operators':
            more_records = (len(response_data['data']) == 20)
            parameters['index'] += 1
return records
我传入的参数dict只是{'limit':99},这是每页的最大限制