2014-07-01 78 views
0

我正在研究'單頁應用程序',並且正在尋找確保頁面呈現完成的方法。jQuery延期對象

我的應用程序流程是這樣的:

  1. 繪製的導航標記
  2. 添加覆蓋顯示頁面內容,正在獲取
  3. 實際加載的內容&它注入到頁面內容區域

現在這是我的缺點:

在頁面內容被注入之後,我初始化標記相關的小部件(引導,自定義事件等)。

這意味着什麼,頁面內容仍然可以操縱,正因爲如此,我在想,如果 我可以使用jQuery的遞延對象(以及如何)作爲功能隊列,與可以作爲被執行異步操作的功能以及普通的舊同步功能。

使用它,我希望能夠告訴所有小部件何時被初始化,然後刪除頁面加載指示器。

+0

是的,你可以使用承諾要知道當數異步函數已經完成,但是您希望我們回答什麼,沒有代碼只是一個模糊的問題? – adeneo

+0

小工具提供什麼反饋?他們在初始化完成後是否給你一個承諾? – Bergi

+0

我已經更新了我的問題,我正在尋找這樣的用法的例子,甚至可能是一篇好文章,因爲我找不到幫助我理解概念的文章。 –

回答

1

你可以使用jQuery的延遲對象來創建一個異步函數隊列。

下面是一個例子實現(通過的jsfiddle/coffeeandcode):

var Queue = function() { 
    var lastPromise = null; 

    this.add = function(obj, method, args, context) { 
     var methodDeferred = $.Deferred(); 
     var queueDeferred = this.setup(); 
     if(context === undefined) { context = obj; } 

     // execute next queue method 
     queueDeferred.done(function() { 


      // call actual method and wrap output in deferred 
      setTimeout(function() { 
       obj[method].apply(context, args); 
       methodDeferred.resolve(); 
      }, 100); 


     }); 
     lastPromise = methodDeferred.promise(); 
    }; 

    this.setup = function() { 
     var queueDeferred = $.Deferred(); 

     // when the previous method returns, resolve this one 
     $.when(lastPromise).always(function() { 
      queueDeferred.resolve(); 
     }); 

     return queueDeferred.promise(); 
    } 
}; 

這裏你可以看到在行動代碼:

http://jsfiddle.net/coffeeandcode/yg9P6/