Javascript 我是否需要Web工作者来循环AJAX请求?

Javascript 我是否需要Web工作者来循环AJAX请求?,javascript,ajax,web-worker,Javascript,Ajax,Web Worker,给定:用于解析网站上部分数据的php脚本。它解析大约10k个产品,因此速度相当慢 我需要为它制作一个带有html/css/js的web前端。我做了一个循环,它发出ajax请求并显示进度信息。它使用syncronousajax,因为它需要等待另一个请求完成后才能执行另一个请求 do { var parseProductsActive = true; var counter = 0; myAjax('parseProducts.php?start='+counter, fa

给定:用于解析网站上部分数据的php脚本。它解析大约10k个产品,因此速度相当慢

我需要为它制作一个带有html/css/js的web前端。我做了一个循环,它发出ajax请求并显示进度信息。它使用syncronousajax,因为它需要等待另一个请求完成后才能执行另一个请求

 do {
    var parseProductsActive = true;
    var counter = 0;
    myAjax('parseProducts.php?start='+counter, false, function(resp) {
        if (resp[0]=='s') {
            counter += Number(resp.substring(1));
            parseProductsActive = false;
        }
        else {
            counter += Number(resp);
        }   
        self.postMessage(counter);  
    });
 } while (parseProductsActive==true);
我在一个网络工作者中做这件事,因为我担心它会因为这个无休止的循环而挂断接口,(a)ajax本身的同步性无助于解决问题


但当我尝试在web worker中使用ajax时,我发现这很难,尽管可能,因为jQuery在web worker中根本不起作用。它甚至将DOM用于非DOM操作,而DOM在Web Worker中不可用。许多开发人员对使用Web Workers表示怀疑。我只是想问一下我做得对还是错。还有什么我看不到的表面解决方案吗?

你猜对了:递归回调是按顺序执行一系列异步请求的方法。它可能看起来有点像这样:

var parseProductsActive = true;
var counter = 0;

//define the loop
function doNextAjax(allDone){
   //Instead of just returning, an async function needs to 
   //call the code that comes after it explicitly. Receiving a callback
   //lets use not hardcode what comes after the loop.

  if(!parseProductsActive){
    allDone();
  }else{
    //use async Ajax:
    myAjax('parseProducts.php?start='+counter, true, function(resp) {
        if (resp[0]=='s') {
            counter += Number(resp.substring(1));
            parseProductsActive = false;
        }
        else {
            counter += Number(resp);
        }   
        self.postMessage(counter);

        doNextAjax(); // <---
    });
}

//Start the loop
doNextAjax(function(){
  console.log("the code that runs after the loop goes here")
});

//BTW, you might be able to get rid of the "parseProductsActive" flag with a small
// refactoring but I'm keeping the code as similar as possible for now.
//It would be kind of equivalent to writing your original loop using a break statement.
var parseProductsActive=true;
var计数器=0;
//定义循环
函数doNextAjax(allDone){
//异步函数需要
//显式调用它后面的代码。接收回调
//让我们不要硬编码循环后面的内容。
如果(!parseProductsActive){
allDone();
}否则{
//使用异步Ajax:
myAjax('parseProducts.php?start='+计数器,true,函数(resp){
if(resp[0]=='s'){
计数器+=数字(分别为子串(1));
parseProductsActive=false;
}
否则{
计数器+=编号(resp);
}   
self.postMessage(计数器);

doNextAjax();//您可以一次将记录放入AJAX,比如100条,并在不使用Web Worker的情况下动态更新显示吗?这和我说的不一样吗?它怎么不会挂在页面上?如果我们使用循环编写它。不,您可以异步(真正的AJAX)获取100条记录(一次),显示它们,然后在第一个请求完成后再获取100。>然后在第一个请求完成后再获取100。你说的“然后”是什么意思?我在哪里写它?你建议递归回调吗?但是,Web Workers不好吗?考虑到旧浏览器不支持它,它不适合一般用户,而是适合将使用解析器的单个用户。我的解决方案可以实现吗?你可以在这里使用webworkers,但它没有那么大的帮助。webworkers的重点是让你做大量的意图在一个单独的线程中进行JS处理,但在这种情况下,你只需要做很少的处理,而需要等待服务器响应。最后,如果你关心的是能够使用loopp而不是递归来编写代码,那么使用CPS编译器是一个更直接和兼容的解决方案。另一个问题。如果我们有一个取消对ajax请求的排序,而是以物理方式并行运行?我是否可以在没有web workers的情况下运行并行ajax请求,以便从并行化的性能中获益?如果您希望一次使用多个线程/核心,您将需要web workers。但是,如果您正在执行与现在类似的操作,那么re的处理量很小,等待时间很长,然后你就可以通过回调合作完成所有事情:我尝试过这个方法,但尽管它们以不同的顺序完成,但它们的工作时间相同,就像同步运行一样。在哪里,通过web workers或iFrame运行它们给了我巨大的性能优势。有点奇怪。我可以从哪里了解ajax的reali所有细节都是什么?