0

我有一个非标准的场景,我正在制作一个嵌入式电子书阅读器,它使用 webview 来显示本地 html epub 文件。

我所做的是通过 ajax 加载所有 html 文件,解析它们的内容并将它们附加到 body,ajaxes 区域快速但执行附加的回调需要一些时间。它们并行运行,但回调同步运行,在同一个 JS 线程上,并通过消息循环排队。

不,我需要取消此操作,但是由于取消调用只是另一条排队的消息,这显然在所有回调完成后运行,这显然对我没有用。有什么方法可以从 javascripts 事件队列中清除这些回调或添加新消息?

谢谢

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);
        }
    }
};
4

1 回答 1

-1

不,但如果它们被执行,你可以取消它们。例如:

var cancel = false;

setInterval(function(){
  if(cancel) return;
  alert("wohoo");
},1000);

因此,如果您想取消活动:

cancel = true;
于 2017-09-04T15:40:56.127 回答