让xmlhttprequest同步可用的情况

时间:2015-12-02 15:32:19

标签: javascript asynchronous synchronization xmlhttprequest specs

可以简单地将多个同步请求封装为异步请求。

以下代码中的“func”参数可以例如按顺序包含多个同步请求。这应该为您提供更多的数据功能,与使用DOM作为媒介来对比数据形成鲜明对比。 (还有另外一种方法吗?自从我使用javaScript以来已经有一段时间了)

function asyncModule(func)
{
    "use strict";
    var t, args;
    t = func.timeout === undefined ? 1 : func.timeout;
    args = Array.prototype.slice.call(arguments, 1);
    setTimeout(function () {
        func.apply(null, args);
    }, t);
}

现在我的推理肯定是错的,因为这是规范所说的:

  

工作人员之外的同步XMLHttpRequest正在从Web平台中删除,因为它会对最终用户的体验产生不利影响。 (这是一个需要很多年的漫长过程。)当JavaScript全局环境是文档环境时,开发人员不得为async参数传递false。强烈建议用户代理在开发人员工具中警告这种用法,并尝试在发生时抛出InvalidAccessError异常。 @ https://xhr.spec.whatwg.org/

我认为您会不惜一切代价避免请求中的异步,而是在异步函数中包装同步请求。

以下是主要问题及后续行动。

  • 我给出的例子有什么问题吗?

如果没有,那么:

  • 如何强制请求异步解决方案?

不言而喻,如果他们只是错误或半真半假,你就可以自由地揭穿我的任何“主张”。我对此感到困惑,我告诉你。

请记住,我在终端中测试javaScript,而不是在浏览器中测试。我在GO编程语言中使用了网络服务器,一切似乎都运行良好。直到我在浏览器中测试代码,我得到了这个规范的提示。

1 个答案:

答案 0 :(得分:0)

此答案已经过编辑。

是的,我的理由是错误的!

有两个角度需要考虑。 异步在javascript中实际意味着什么? 一个异步调用可以阻止另一个异步调用吗?

javascript中的异步并不意味着脚本将在具有多个callstack的交错/交替进程中运行。它可以更像是一个全局定时推迟/推迟命令,一旦有机会就会完全接管。这意味着异步调用可以阻塞,非阻塞“async:true”部分只是基于xhttprequest实现方式的“技巧”。

这意味着在setTimeout中封装同步请求可能等待,因为失败的请求最终会阻止其他无关的异步请求,而“async:true”功能只会根据其状态值执行。

这意味着当您需要执行多个依赖于另一个请求的请求时,较旧的浏览器支持需要您链接请求或使用DOM作为媒介...

幸运的是,Javascript现在有了主题。现在我们可以简单地使用线程来同步对多个相关请求进行干净的封装。 (或任何其他后台任务)

简而言之: 如果浏览器位于worker中,浏览器不应该有同步运行请求的任何问题。浏览器尚未成为操作系统,但它们更接近。

P.S。这个答案或多或少是因为反复试验。我围绕firefox做了一些测试用例,观察到异步请求会停止其他异步请求。我只是从那个观察中推断出来。如果我仍然遗失某些东西,我不会接受我自己的答案。

编辑(再次......) 实际上,也许可以使用xhttp.timeout和xhttp.ontimeout。见Timeout XMLHttpRequest 这意味着如果抽象setTimeout并将其用作调度程序,则可以从错误请求中恢复。

// Simple example
function runSchedular(s)
{
    setTimeout(function() {
        if (s.ptr < callQue.length) {
            // Handles rescheduling if needed by pushing the que.
            s = s.callQue[s.ptr++](s);
        } else {
            s.ptr = 0;
            s.callQue = [];
            s.t = 200;
        }
        runSchedular(s);
    }, s.t);
}