3

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

例如,以下代码中的“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 编程语言中使用了网络服务器,一切似乎都运行良好。直到我在浏览器中测试代码,我才得到这个规范的提示。

4

1 回答 1

0

此答案已被编辑。

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

有两个角度可以考虑。javascript中的异步实际上是什么意思?一个异步调用可以停止另一个异步调用吗?

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

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

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

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

简而言之:如果浏览器在工作人员中,则同步运行请求不应该有任何问题。浏览器还没有成为操作系统,但它们更接近了。

PS这个答案或多或少是因为反复试验。我围绕 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);
}
于 2015-12-03T19:38:35.460 回答