首页 > 解决方案 > 依次调用 API 直到响应为空

问题描述

我正在尝试连续调用 API 并通过页面计数,直到响应为空。每个页面最多返回 1000 个“结果”,直到最终只返回[].

我尝试过下面的代码,但是 while 循环无限期地继续,并且标志永远不会设置为 false,尽管我知道第 5 页返回空。

 var count = 1;
 var flag = true;
 var request = new XMLHttpRequest();

 while (flag == true) {
    request.open('GET', 'https://api.example.net/results/?page=' + count, true);
    count++;
    request.onload = function () {
      var data = JSON.parse(this.response);
      if (data.length == 0) {
        flag = false;
      }
    }
    request.send();
 }

标签: javascriptxmlhttprequest

解决方案


问题在于代码是异步的。特别是,onload回调仅在收到响应时触发,在调用后的某个时间。您的脚本不会停止运行以“等待”响应,因此它会继续遍历循环,因为flag仍然是true. 当“空”响应出现并flag变为假时,循环可能已经运行了数千次,从而设置了“无用”的 Ajax 请求。

@AmitJoki 已经建议了如何解决这个问题。这是一种方法(使用@PranavCBalan 建议的递归 - 尽管当我看到他的评论时我已经开始写这个了:-)):

function sendRequest(count) {
    var request = new XMLHttpRequest();
    request.open('GET', 'https://api.example.net/results/?page=' + count, true);
    request.onload = function () {
      var data = JSON.parse(this.response);
      if (data.length > 0) {
        sendRequest(count+1);
      }
    }
    request.send();
}

sendRequest(1);

关键区别在于,在发送一个请求后,此代码不会发送另一个请求,直到响应返回并确认data.length大于 0。


推荐阅读