代码之家  ›  专栏  ›  技术社区  ›  maxpovver

如何实现纯js回调循环?

  •  0
  • maxpovver  · 技术社区  · 2 年前

    我有一个API,我需要从中查询N页的数据。因为我不想让API过载,所以我想按顺序执行,而不阻塞主线程。

    代码应该是这样的:

    var res = []; // all data from api
    var totalPages = 10;
    var pageSize = 100;
    for (let page = 0; page < totalPages; page++) {
        // load using jQuery ajax request
        $.get('api.php', { page: page, page_size: pageSize }, function(result) {
            res.push(...result); // add data to resulting array
        });
    }
    

    但这种方法有几个问题:

    1. 因为它是异步的,所以它只会并行运行所有请求,从而导致API过载。我需要它们仍然异步运行,但每一个都应该只在前一个完成时运行。
    2. 由于所有的调用都是异步的,到循环结束时,我们仍然没有请求的数据——它将在后台加载。我们需要以某种方式等待所有回调完成后再返回 res 其他需要它的代码。
    3. 无法让每个回调将其结果传递给下一个回调,当某个回调收到来自服务器的“停止加载”/“不再加载数据”请求时,这是停止加载的唯一方法

    有没有一种方法可以解决这些问题,而不用使用一些辅助库或承诺?只是普通的香草javascript。 抱歉,如果有些事情看起来不清楚,我在js方面不是很有经验

    1 回复  |  直到 2 年前
        1
  •  2
  •   syduki    2 年前

    您可以在这里使用简单的递归,如下所示:

    var res = []; // all data from api
    var totalPages = 10;
    var pageSize = 100;
    
    const loader = page => {
        // load using jQuery ajax request
        $.get('api.php', { page: page, page_size: pageSize }, function(result) {
            res.push(...result); // add data to resulting array
            if (page < totalPages)
              loader(++page)
            else
              console.log('DONE!');
        });
    }
    
    loader(0);