javascript - 在响应准备好之前,如何使用 xmlhttprequest 发出请求?
问题描述
我正在尝试向向 API 进行查询的路由发出请求,如果 API 有数据,则响应是用 API 数据呈现另一个网站。但是如果数据还没有准备好,因为它还在处理中,路由返回一个字符串“还没有完成”。
我想做的是:发出一个获取请求,如果响应“尚未完成”等待 5 秒,然后再次请求,直到响应是数据。之后,脚本将打开带有加载数据的新页面的窗口。
这是我已经做的:
job_id = document.querySelector("#job_id").getAttribute("value")
code = document.querySelector("#code").getAttribute("value")
var myRequest = new XMLHttpRequest();
myRequest.open('GET', `http://127.0.0.1:5000/status/${job_id}/${code}`);
myRequest.onreadystatechange = function () {
if (myRequest.readyState === 4 && myRequest.responseText != 'not finished yet') {
window.location = `http://127.0.0.1:5000/status/${job_id}/${code}`
}
};
如果有人知道它是否有效或知道更好的处理方法,我将不胜感激。
提前致谢。
解决方案:
几个小时后,我终于找到了处理它的方法。仍然不知道这是否是最好的方法。
function search() {
job_id = document.querySelector("#job_id").getAttribute("value")
code = document.querySelector("#code").getAttribute("value")
var myRequest = new XMLHttpRequest();
myRequest.open('GET', `http://127.0.0.1:5000/status/${job_id}/${code}`);
myRequest.send();
myRequest.onreadystatechange = function () {
if (myRequest.readyState === 4 && myRequest.responseText === 'not finished yet') { setTimeout(function () {search();}, 5000)
}
else if(myRequest.readyState === 4 && myRequest.responseText != 'not finished yet')
{ window.location = `http://127.0.0.1:5000/status/${job_id}/${code}`}}
}
search()
解决方案
我var option = {};
用作全局对象来处理 OOP(面向对象编程)。
你想要做的是当你需要定义一些东西时,给它一个函数前缀和一个标识符,这样你就可以避免冲突。
您发布了一些代码,因此在 1 声望和体面的格式下,您比从 1 开始的大多数代码要好得多,赞。假设您的工作 ID 为 79。因此您需要定义以下内容:
option.job_79 = 1;
现在我将子对象分配为 1 作为状态,它已初始化。由于该option
对象是全局范围的,因此您可以再次调用您的ajax()
函数,并且在它不知道另一个ajax()
函数已经在运行的情况下,您只需检查一下typeof option.job_79
!
一些建议:
如果您对编程充满热情,您最终会希望将所有 AJAX 函数合并到一个精炼的函数中,这不仅会大大简化您的代码,而且前期成本会节省您的成本,而且越早越好(尽管随着时间的推移,你将不得不对其进行改进)。
还要避免框架和库的弊端。人们对它们非常重视,但几年后,当您想要更新时,您必须花费数天或数周的时间重构代码。除了我的经验水平之外,我从来没有因为浏览器更新而只使用纯 JavaScript 重构代码。这条道路上还隐藏着许多其他好处,大多数人都没有意识到这一点。
推荐阅读
- javascript - 当 Arduino 向 NW.js 发送空的 ArrayBuffer 时该怎么办?
- android - android.widget.Toolbar 不能强制转换为 androidx.appcompat.widget.Toolbar 即使不是这样
- asp.net-core - Serilog 过滤器表达式无法排除给定的端点日志
- amazon-web-services - AWS ElasticSearch 查询关键字没有得到我期望的结果
- apache-zookeeper - 从 zookeeper 客户端获取主机信息
- python - Python/Pandas for 循环遍历列表仅处理列表中的最后一项
- sql - 识别不包含在现有范围内的值
- powershell - Powershell - Office365 Exchange 入站和出站邮件
- python - 从熊猫系列中过滤熊猫df多列
- python - 将json文件中的数据提取到csv中