gpt4 book ai didi

javascript - 避免 XMLHttpRequest 链调用泄漏

转载 作者:行者123 更新时间:2023-11-28 04:14:01 25 4
gpt4 key购买 nike

在我的代码(监视应用程序)中,我需要以链式调用的形式定期使用 XMLHttpRequest 对象调用服务器。每个调用恰好需要 15 秒,这是由服务器计时的,因为它在该时间段内传递了多个部分结果(HTTP 100 继续)。完成当前调用后,当前 XMLHttpRequest 对象的 onreadystatechange 事件处理程序需要立即创建并启动下一个请求(使用新实例),因此与服务器的通信几乎保持无缝。

它的工作方式是,每次调用都会在堆栈中保留调用者的对象上下文,因此由于这是一个必须保持打开状态数天的页面,因此堆栈不断增长,垃圾收集器没有机会声明数据。请参阅以下堆栈跟踪:

Stack trace over a couple of minutes

我无法使用计时器(setInterval 等)来启动下一个请求。它应该从前一个结局内部启动。来自服务器的数据必须尽快到达,不幸的是,当今的浏览器在页面未聚焦时会限制计时器。正如我所说,这是一个监视应用程序,旨在始终在用户的辅助监视器中打开(很少处于焦点)。我还需要处理 HTTP 超时和其他类型的导致 15 秒序列脱轨的错误。应该始终有且只有一个与服务器打开的 channel 。

我的问题是,在创建 XMLHttpRequest 对象时,是否有任何方法可以避免将整个上下文保留在堆栈中。即使在 DOM 对象上调用 click() 方法也会使堆栈/上下文保持事件状态。甚至 promise 似乎也保留了上下文。

我也无法使用 websockets,因为服务器不支持它们。

更新:

更复杂,购买本质上是这样的:

var xhttpObjUrl;
var xhttpObj;

onLoad() {
loadXMLDoc(pollURL + "first=1", true);
}

function loadXMLDoc(url, longtout) {
xhttpObjUrl = url;
xhttpObj = new XMLHttpRequest();
xhttpObj.open(method, url, true);
xhttpObj.onprogress = progress;
xhttpObj.onloadend = progress;
xhttpObj.ontimeout = progress;
if (commlog) consolelog("loadXMLDoc(): url == " + dname);
xhttpObj.send("");
}

function progress() {
if (!xhttpObj) return;
var state = xhttpObj.readyState;
var status;
var statusText;
if (state == 4 /* complete */ || state == 3 /* partial content */) {
try {
status = xhttpObj.status;
statusText = xhttpObj.statusText;
if (status == 200) parseServerData();
} catch (err) {
status = 500;
statusText = err;
}
if (state == 4 || status != 200) {
/* SERVER TERMINATES THE CONNECTION AFTER 15 SECONDS */
/* ERROR HANDLING REMOVED */
var obj = xhttpObj;
xhttpObj = undefined;
abortRequest(obj);
obj = false;
RequestEnd();
}
}
}

function RequestEnd(error) {
var now = (new Date).getTime();
var msdiff = now - lastreqstart;
var code = function () { loadXMLDoc(pollURL + 'lastpoint=' + evtprev.toString() + '&lastevent=' + evtcurrent.toString()); return false; };
if (msdiff < 1000) addTimedCheck(1, code); /** IGNORE THIS **/
else code();
}

最佳答案

我已经使用网络 worker 解决了我的问题。工作人员每次都会结束 XMLHttpRequest 并向页面发送一条包含收集到的数据的消息。然后,当页面处理完数据时,它会向工作人员发送一条消息以启动新请求。因此,我的页面在请求之间不会有任何不必要的延迟,并且不会不断建立堆栈。如果出现错误,我会终止该工作人员并创建一个新工作人员,以防万一。

关于javascript - 避免 XMLHttpRequest 链调用泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46036323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com