2014-03-12 69 views
1

我正在啓動一個具有多個過程的Web應用程序,這需要一些時間。 爲了減少加載時間,我想實現異步處理類似以下內容:如何管理JavaScript中複雜的異步處理?

loadXML()----- 
       \ 
loadCanvas()---setupCanvas() 
          \ 
setupYoutubePlayer()---------startApplication() 

也就是說,加載頁面時,我要同時啓動loadXML()loadCanvas()setupYoutubePlayer(),和消防setupCanvas()loadXML()loadCanvas()完成,並且setupApplication()setupCanvas()setupYoutubePlayer()完成後觸發。

loadXML()setupCanvas()包含AJAX處理,並且setupYoutubePlayer()包含API的訪問,並且需要API-指定的回調函數(onYouTubeIframeAPIReady())。

經過幾天的谷歌搜索,我發現 jQuery.DefferedAsync.js。說到Deferred,我可以將所有 進程封裝爲Deferred.promise()Deferred.resolve(),但我發現使用when()then()來實現此嵌套異步處理沒有簡單的解決方案 。 至於Async.js,我不知道處理setupYoutubePlayer()

我錯過了什麼?或者在這種情況下還有其他知識嗎? 請幫忙。謝謝。

回答

2

這是超級微不足道,甚至只用jQuery的承諾(假設1.8+),你可以這樣做:

var xml = loadXML(); 
var canvas = loadCanvas(); 
var youtubePlayer = setupYoutubePlayer(); 
$.when(
    $.when(xml, canvas).then(setupCanvas), 
    youtubePlayer 
).then(startApplication); 
2

請你幫個忙,並使用真正承諾執行,而忘記了jQuery中的roflmaolol實施。

看看http://www.promisejs.org/http://www.promisejs.org/intro/#all更具體),他們有各種用例的代碼示例和幾個不同的promise庫的列表。一些庫是最小的準系統,其他庫提供擴展到諾言規格。

如果我明白你的流量是否正確,這將可能做到這一點:

var a = loadXML(); 
var b = loadCanvas(); 
Promise.all([a, b]).then(function() { 
    var c = setupCanvas(); 
    var d = setupYoutubePlayer(); 
    return Promise.all([c, d]); 
}).done(startApplication); 

或者,如果setupYoutubePlayer可以在相同的工序loadXMLloadCanvas函數調用:

var a = loadXML(); 
var b = loadCanvas(); 
var c = setupYoutubePlayer(); 
Promise.all([a, b]).then(function() { 
    var d = setupCanvas(); 
    return Promise.all([c, d]); 
}).done(startApplication); 

一個大概可以進一步優化上面的代碼,但我把它作爲練習給讀者;)

+1

簡單,最好的。這是我的建議,但o已經很好地回答了。榮譽 – Bikas

0

你也可以使用Iced Cof feeScript,它使您可以等待並推遲關鍵字以同步方式處理異步回調。