如何执行;同步;javascript调用服务器而不锁定浏览器

如何执行;同步;javascript调用服务器而不锁定浏览器,javascript,browser,request,nonblocking,synchronous,Javascript,Browser,Request,Nonblocking,Synchronous,这可能是一个愚蠢的问题,但是……Javascript中有没有一种方法可以在不锁定浏览器线程的情况下同步等待特定请求完成 目标是使用ajax调用服务器端,并在调用完成后执行一段代码,避免回调(hell)。 一些像这样的简单代码 // some js code var result = doServerCall(); // w/out (b)locking the browser thread -> browser must remain responsive // some js code

这可能是一个愚蠢的问题,但是……Javascript中有没有一种方法可以在不锁定浏览器线程的情况下同步等待特定请求完成

目标是使用ajax调用服务器端,并在调用完成后执行一段代码,避免回调(hell)。 一些像这样的简单代码

// some js code
var result = doServerCall(); // w/out (b)locking the browser thread -> browser must remain responsive
// some js code to process the result
请注意,setTimeoutsetInterval不是可接受的解决方案,需要的是如上所述的直接执行。最终,回调之后,执行将在完成对服务器的调用时继续,这也是正常的(见下文)

我在Firefox插件中使用了以下内容(这不是我想要的,但仍然是一个可接受的解决方案)

回调

function processResponse ( xhrResponse ) {
   globalResult = xhrResponse;
   globalDone = true;
}
通过互联网、StackOverflow和论坛,每个人似乎都希望实现这一点,但没有浏览器希望实现这一点

这可能是一个愚蠢的问题,但是……Javascript中有没有办法 在不锁定的情况下同步等待特定请求完成 浏览器线程

不,用同步代码无法做到这一点。异步代码和AJAX的全部目的就是要解决这个问题

这可能是一个愚蠢的问题,但是……Javascript中有没有办法 在不锁定的情况下同步等待特定请求完成 浏览器线程

不,用同步代码无法做到这一点。异步代码和AJAX的全部目的就是要解决这个问题

这可能是一个愚蠢的问题,但是……Javascript中有没有办法 在不锁定的情况下同步等待特定请求完成 浏览器线程

不,用同步代码无法做到这一点。异步代码和AJAX的全部目的就是要解决这个问题

这可能是一个愚蠢的问题,但是……Javascript中有没有办法 在不锁定的情况下同步等待特定请求完成 浏览器线程


不,用同步代码无法做到这一点。异步代码和AJAX的全部目的就是解决这个问题。

通过从Webworker发出请求,可以实现同步HTTP请求,而不会阻塞UI线程。但是,将结果传回UI线程仍然是异步的。此外,网络工作者的创业需要花费时间和内存,所以请记住这一点

另一种可能性是使用ES6模拟异步函数的非阻塞同步执行。但是,浏览器对此的支持仍然有限

Webworker示例:

工人

self.onmessage = function (event) {
    if (event.data === "init") {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "foo.com", false); // false means non-async
        xhr.send(null);
        var result = xhr.responseText;
        // do stuff with result...

        self.postMessage(result); // pass result
        self.close(); // terminate self
    }
};
主脚本

var worker = new Worker("myWorker.js");
worker.onmessage = function (event) {
    console.log(event.data);
};
worker.postMessage("init");

也可以使用Webworker,而不需要单独的文件,如前所述。

您可以通过从Webworker发出请求来实现不阻塞UI线程的同步HTTP请求。但是,将结果传回UI线程仍然是异步的。此外,网络工作者的创业需要花费时间和内存,所以请记住这一点

另一种可能性是使用ES6模拟异步函数的非阻塞同步执行。但是,浏览器对此的支持仍然有限

Webworker示例:

工人

self.onmessage = function (event) {
    if (event.data === "init") {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "foo.com", false); // false means non-async
        xhr.send(null);
        var result = xhr.responseText;
        // do stuff with result...

        self.postMessage(result); // pass result
        self.close(); // terminate self
    }
};
主脚本

var worker = new Worker("myWorker.js");
worker.onmessage = function (event) {
    console.log(event.data);
};
worker.postMessage("init");

也可以使用Webworker,而不需要单独的文件,如前所述。

您可以通过从Webworker发出请求来实现不阻塞UI线程的同步HTTP请求。但是,将结果传回UI线程仍然是异步的。此外,网络工作者的创业需要花费时间和内存,所以请记住这一点

另一种可能性是使用ES6模拟异步函数的非阻塞同步执行。但是,浏览器对此的支持仍然有限

Webworker示例:

工人

self.onmessage = function (event) {
    if (event.data === "init") {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "foo.com", false); // false means non-async
        xhr.send(null);
        var result = xhr.responseText;
        // do stuff with result...

        self.postMessage(result); // pass result
        self.close(); // terminate self
    }
};
主脚本

var worker = new Worker("myWorker.js");
worker.onmessage = function (event) {
    console.log(event.data);
};
worker.postMessage("init");

也可以使用Webworker,而不需要单独的文件,如前所述。

您可以通过从Webworker发出请求来实现不阻塞UI线程的同步HTTP请求。但是,将结果传回UI线程仍然是异步的。此外,网络工作者的创业需要花费时间和内存,所以请记住这一点

另一种可能性是使用ES6模拟异步函数的非阻塞同步执行。但是,浏览器对此的支持仍然有限

Webworker示例:

工人

self.onmessage = function (event) {
    if (event.data === "init") {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "foo.com", false); // false means non-async
        xhr.send(null);
        var result = xhr.responseText;
        // do stuff with result...

        self.postMessage(result); // pass result
        self.close(); // terminate self
    }
};
主脚本

var worker = new Worker("myWorker.js");
worker.onmessage = function (event) {
    console.log(event.data);
};
worker.postMessage("init");

Webworkers也可以在不需要单独文件的情况下使用,如前所述。

异步方式和AJAX是可以的,但是您的代码必须围绕回调构建。这就是我想要避免的。是的,当然它应该围绕回调构建。这就是异步代码的工作原理,与同步和顺序代码相反。如果您不想阻止用户的浏览器,这是用javascript编写代码的正确方法。然而,第二个示例不阻止浏览器,只需要我编写的一个回调(不需要其他回调),并且是连续的。因此,似乎有一种方法可以在浏览器中使用它(例如,mozilla为插件使用它)。因此,也许问题应该是……为什么没有浏览器支持同步顺序非阻塞请求……异步方式和AJAX是可以的,但是您的代码必须围绕回调构建。这就是我想要避免的。是的,当然它应该围绕回调构建。这就是异步代码的工作原理,与同步和顺序代码相反。如果您不想阻止用户的浏览器,这是用javascript编写代码的正确方法。然而,第二个示例不阻止浏览器,只需要我编写的一个回调(不需要其他回调),并且是连续的。所以