2011-04-18 70 views
1

我正在使用YUI3小部件,但對於您來說jQuery的人只是假裝我們正在討論插件。我有一個大的json數據集,裏面有超過5000條記錄。在我的應用程序中,至少有5個小部件需要訪問我的數據集。目前我正在將json嵌入到html中,並在頁面加載時用YUI3抓取它,然後渲染我的小部件。Javascript:將大型數據集傳遞給多個函數

我想避免的是將5個數據集存儲在內存中。我試圖想出一個讓我避免這種情況的設計模式。我相信如果我將這些數據作爲屬性傳遞給我的小部件,它會通過值傳遞它,而不是引用它,並將它複製到內存中。如果我對此有錯,請告訴我。由於數據是全球可用的,我的小部件可以直接訪問它,但我認爲這也會將數據複製到內存中。

我認爲如果我最初創建一個對象,將數據加載到對象中,並將該對象作爲屬性傳遞,它將通過引用傳遞它,這將允許我的所有小部件訪問我的數據的相同實例。

這是你會做什麼?請讓我知道你的想法,以及你如何設置這樣的事情。

感謝您的(正面)輸入!

回答

2

如果保留「數據集」在它自己的獨立的.js文件周圍,像這樣定義的:

// My Huge Data Set 
// Author: bababa 
// 
(function(window) { 
    window['hugeDataSet'] = { 
    // millions of lines of stuff 
    }; 
})(this); 

那麼當您導入與普通<script>標籤或使用腳本加載器,將只有一個全球數據副本。你可以這樣引用它:

someWidget.doSomething(hugeDataSet); 

並且不會複製數據。當然,您可以將內嵌的數據放入您的HTML中的<script>,但如果您的HTML是由服務器端模板(如php或jsp或其他)生成的,則它不會被緩存。

+0

html不是動態的,但數據是。我目前使用腳本標記將它嵌入到html中,所以我現在可以從我的所有小部件中全局訪問數據集。因此,每次我將數據分配給其中一個小部件的變量時,它都不會在內存中創建副本?我不完全確定JS如何處理這樣的事情。另外,感謝您的幫助。 – imns 2011-04-18 15:44:51

+0

不,只是傳遞一個對象的引用絕對不會複製。事實上,你必須明確編寫代碼來製作副本。 – Pointy 2011-04-18 15:48:17

-1

您的小部件需要每次訪問所有5,000條記錄嗎?或者他們只需要特定的數據子集?

在我看來,你正在嘗試使用JSON有一個數據庫的替代品在這裏。

最可能的解決方案是將數據放入正確的數據庫,使用服務器端腳本請求所需的數據並將這些數據返回給您的小部件。

與數據庫查詢相比,解析文本非常慢。

+0

數據在數據庫中,我們不使用json來替換它。我們正在製作一個處理客戶端幾乎所有內容的應用程序。我們希望它非常快速,而不是每次我們做一些簡單的事情,比如請求一個新頁面,這就是我們這樣做的原因。 – imns 2011-04-18 15:42:25

+0

以JSON轉儲數據庫的內容並將其發送到客戶端*是*用json替換數據庫。加載5K記錄並用JavaScript解析它並不是最快的方法(否則,你不會問這個問題。正如Pointy所指出的那樣,你的數據集不會被複制幾次)。考慮緩存和預取的混合來優化速度。 – Sylverdrag 2011-04-18 16:04:04