2012-11-05 50 views
4

我已經構建了一個單頁面應用程序,供用戶構建報告。用戶會看到一個表單,允許他們選擇數據源,圖表類型和主題,然後在確認頁面加載所需文件並繪製圖表。是否可以實現模塊加載作爲承諾?

爲了獲得更好的性能,我希望並行加載代碼模塊和數據。例如,如果用戶選擇「餅圖」,「藍主題」和「航空公司統計」:

WHEN(JS模塊餅圖被加載) 和(藍色主題CSS被加載) 和(航空統計JSON是加載)

THEN(繪製圖表)

我已經發現了一些實現AMD庫,以及一個數字,實現承諾庫,但沒有在那裏加載模塊和許諾可以上述組合,如我的例子。這是可能的,是否有任何庫已經實現了這個?

我的需求是客戶端JavaScript。

回答

1

jQuery實際上可以通過promises來做到這一點。這只是修改代碼的問題。

假設你自己的代碼和所有生活in the same domain或如果跨域,服務器allows CORS,我們將加載每個.ajax()。然後,我們將使用.when()來檢測何時加載所有的承諾,並加入我們的回調來執行所有的承諾解決。

//you can provide a detailed setting for each using .ajax()'s second parameter 
//however, jQuery can "smart detect" the content's dataType 

var chart = $.ajax(urlOfChart), //script 
    theme = $.ajax(urlOfTheme), //css 
    data = $.ajax(urlOfData); //JSON 

//we use .when() to check when all three resolves 
//the arguments will be the jqXHR objects for the requests 
//in the order they were given in the argument list 
$.when(chart,theme,data).then(function(chart,theme,data){ 

    //according to jQuery.ajax(), if a script is requested, it is evaluated 
    //and we still get it's plain text content 
    //so with respect to the script, we do no processing 

    //with the css, we get it as plain text since no dataType value handles it 
    //we embed it into the DOM by creating a style element 
    //and append the text in it for the styles to take effect on the page 
    $('<style type="text/css" />').html(theme).appendTo('head'); 

    //as for the JSON, jQuery converts it into an object 
    //and is passed as an argument as the return data for that promise 

    //...everything is now requested, retrieved and prepared... 
    //everything else goes under here 

}); 
1

CommonJS模塊本身就是承諾,因爲每個工廠只有在需求被定義後纔會被調用。因此,如果您將數據定義爲模塊,並將代碼定義爲需要'js','css','data'的模塊,那麼這實際上可以直接使用。或者,您可以使用Promise作爲CommonJS/AMD之上的抽象,加載CSS(通過例如LABJS?),並加載數據(通過xhr/jsonp)。

+0

對,將數據定義爲模塊也應該起作用,我只是不知道該怎麼做。你能指點我具體的例子還是教程? – Christophe

+0

您的其他模塊是如何定義的?就這樣。例如,對於AMD,你可以調用'define('mydata',{.....})'或類似的東西。 –

+0

我剛接觸AMD,只是使用了來自Dojo Toolkit的開箱模塊。這非常有意義,我只需要學習如何去做。謝謝您的幫助! – Christophe

相關問題