如何将消息预先发送到Javascript事件队列?(取消长时间运行的方法)
我有一个非标准的场景,我正在制作一个嵌入式电子书阅读器,它使用webview显示本地html epub文件 我所做的是通过ajax加载所有html文件,解析它们的内容并将它们附加到body,但是执行附加的回调需要一些时间。它们并行运行,但回调在同一个JS线程上同步运行,并通过消息循环排队 不,我需要取消此操作,但是,由于取消调用只是排队的另一条消息,这显然是在所有回调都完成后运行的,这显然对我没有任何用处。有没有办法从javascripts事件队列中清除这些回调或预先发送新消息 谢谢如何将消息预先发送到Javascript事件队列?(取消长时间运行的方法),javascript,prepend,eventqueue,Javascript,Prepend,Eventqueue,我有一个非标准的场景,我正在制作一个嵌入式电子书阅读器,它使用webview显示本地html epub文件 我所做的是通过ajax加载所有html文件,解析它们的内容并将它们附加到body,但是执行附加的回调需要一些时间。它们并行运行,但回调在同一个JS线程上同步运行,并通过消息循环排队 不,我需要取消此操作,但是,由于取消调用只是排队的另一条消息,这显然是在所有回调都完成后运行的,这显然对我没有任何用处。有没有办法从javascripts事件队列中清除这些回调或预先发送新消息 谢谢 var r
var requestsInFlight;
loadAllSpineElements = function(spineElementsCount) {
requestsInFlight = new Set();
for (i = 0; i < spineElementsCount; i++) {
loadAndAppendSpineElement(innerWrapperDiv, pageCounts, requestsInFlight, i);
}
};
loadAndAppendSpineElement = function(innerWrapperDiv, pageCounts, requestsInFlight, spineElementIndex) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// Long running dom operation
requestsInFlight.delete(this);
if (requestsInFlight.size <= 0) {
handleAllSpinesLoaded(pageCounts);
}
}
};
xhttp.open("GET", "file:///localurl");
xhttp.send();
requestsInFlight.add(xhttp);
};
cancelAll = function() {
if (requestsInFlight) {
for (var it = requestsInFlight.values(), ajax = null; ajax = it.next().value;) {
ajax.abort();
requestsInFlight.delete(ajax);
}
}
};
var-requestsInFlight;
loadAllSpineElements=函数(spineElementsCount){
requestsInFlight=新集合();
对于(i=0;i 如果(requestsInFlight.size否,但如果它们被执行,您可以取消它们。例如:
var cancel = false;
setInterval(function(){
if(cancel) return;
alert("wohoo");
},1000);
如果你想取消这些活动:
cancel = true;
但是我的取消()函数在全部完成之前不会执行,我该如何更改该全局变量?@urSus可能没有填充事件队列?您的代码将有助于解决此问题…好的,我编辑了问题@Jonas w。我如何不填充它?这不是JS固有的用法吗?我不知道如何,我不能使用setInterval。我只想取消设置如果用户这样做,则执行操作。在您的情况下,是否会在回调运行时执行取消变异方法?