javascript - 依次调用 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();
}
解决方案
问题在于代码是异步的。特别是,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。
推荐阅读
- android - 从 Android Studio 启动模拟器的问题 - AVD Pixel_XX_XXX_28 已经在运行
- visual-studio-2017 - 是否可以创建适用于 Visual Studio 和 Blend 的 VSIX 扩展?
- spring-boot - HttpMethod.PUT 上的 400 BAD 请求错误 - 第二次上传文件
- printing - filemaker 9 每张标签页只打印 1 条记录
- python-3.x - “TypeError:在 OAuth 2.0 回调请求期间需要一个类似字节的对象,而不是 'str'”
- javascript - 我可以在 useEffect 挂钩中设置状态吗
- python - 使用 python win32com.client 在 Photoshop 中移动图层
- java - 为什么在此特定代码中会出现 ArrayIndexOutOfBoundsException?
- laravel - laravel vue js组件无法编译
- python - Python - 在 str.split() 之后获取最后一个元素