首页 > 解决方案 > 在响应准备好之前,如何使用 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()

标签: javascriptajaxxmlhttprequest

解决方案


var option = {};用作全局对象来处理 OOP(面向对象编程)。

你想要做的是当你需要定义一些东西时,给它一个函数前缀和一个标识符,这样你就可以避免冲突。

您发布了一些代码,因此在 1 声望和体面的格式下,您比从 1 开始的大多数代码要好得多,赞。假设您的工作 ID 为 79。因此您需要定义以下内容:

option.job_79 = 1;

现在我将子对象分配为 1 作为状态,它已初始化。由于该option对象是全局范围的,因此您可以再次调用您的ajax()函数,并且在它不知道另一个ajax()函数已经在运行的情况下,您只需检查一下typeof option.job_79

一些建议:

如果您对编程充满热情,您最终会希望将所有 AJAX 函数合并到一个精炼的函数中,这不仅会大大简化您的代码,而且前期成本会节省您的成本,而且越早越好(尽管随着时间的推移,你将不得不对其进行改进)。

还要避免框架和库的弊端。人们对它们非常重视,但几年后,当您想要更新时,您必须花费数天或数周的时间重构代码。除了我的经验水平之外,我从来没有因为浏览器更新而只使用纯 JavaScript 重构代码。这条道路上还隐藏着许多其他好处,大多数人都没有意识到这一点。


推荐阅读