2014-02-05 66 views
1

鑑於:一個用於解析網站上數據部分的php腳本。它分析約10k產品,因此速度很慢。我需要Web Workers來循環AJAX請求嗎?

我需要爲它製作一個帶有html/css/js的網頁前端。我做了一個循環,它使得ajax請求和顯示進度信息。它使用syncronous ajax,因爲它需要等到另一個請求完成才能執行另一個請求。

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

我做它在一個網絡工作者,因爲我害怕它會掛斷電話,因爲這無盡的循環,(一)AJAX的同步性本身不會有助於解決prolem的接口。

但是,當我嘗試在web worker中使用ajax時,我發現儘管可能很難,因爲jQuery在Web Worker中根本不起作用。它甚至爲非DOM操作使用DOM,並且在Web Worker中不可用DOM。許多開發人員都懷疑使用Web Workers。我只是想問,如果我做對了還是錯了。有沒有更多的表面解決方案,我看不到?

+1

您可以一次將100條記錄放入AJAX中,並且可以動態更新顯示內容,而無需使用Web Worker? –

+0

我說的是不是一樣的?它如何不會在頁面上掛起?如果我們用循環編寫它。 – Gherman

+1

不,你在異步(真實AJAX)中抓取100條記錄(AT ONCE),顯示它們,然後在第一個請求完成後再取100個記錄(AT ONCE)。 –

回答

1

您猜對了:遞歸回調是按順序執行一堆異步請求的方式。它看起來有點像這樣:

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. 

是的,它的醜陋和冗長,但INTS做原始的Javascript的唯一途徑。如果你想編寫一個看上去像循環的更結構化的版本,而不是一些含有大量gotos的東西,可以看一下異步控制流庫或編譯器之一,它將Javaascript的擴展與異步支持編譯回正則JS與回調。

+0

還是,網絡工作者不好?不是針對普通用戶,考慮到它在舊版瀏覽器中不受支持,而是針對將使用解析器的單個用戶。我的解決方案可以發生嗎? – Gherman

+0

你可以在這裏使用webworkers,但它不會有幫助。網絡工作者的目的是讓你在一個單獨的線程中進行大量的密集型JS處理,但在這種情況下,你正在做很少的處理,並且等待服務器做出響應。最後,如果你關心的是能夠使用loopp而不是遞歸來編寫代碼,那麼使用CPS編譯器是一個更直接和兼容的解決方案。 – hugomg

+0

另一個問題。如果我們有一堆Ajax請求不是按順序進行的,而是在物理上並行運行的呢?我可以在沒有網絡工作人員的情況下運行並行ajax請求,這樣我就可以從性能方面獲得平緩的好處嗎? – Gherman