2013-09-26 107 views
0

所有這些函數都在jQuery異步AJAX成功事件之後調用的主函數中,並且它每秒運行一次。三個函數中的每一個函數都會調用它們中的特定函數。執行一個接一個的函數

這是基本的JavaScript代碼我有:

function mainFunction() { 
    function selectView(){ 
     // do stuff 
    } 
    function startWidgets(){ 
     // do stuff 
    } 
    function popData(){ 
     // do stuff 
    } 
    $.when(selectView()).then(startWidgets).then(popData); 
} 

function ajaxCall(){ 
    ajaxRequest = $.ajax({ 
     type: "GET", 
     url: "", 
     data: {}, 
     async: true, 
     cache: false, 
     timeout:50000, 

     success: function(data){ 
      mainFunction(); 
      setTimeout(
       ajaxCall, 5000 
      ); 
     }, 
     error: function() { 
      // error stuff 
     }, 
     complete: function() { 
      // complete stuff 
     } 
    }); 
}  

selectView() - 使用的jQuery .load()方法基於特定AJAX數據加載HTML結構。

startWidgets() - 通過將小部件放入HTML結構(基於ID和類)來初始化小部件。只有第一次運行。

popData() - 根據AJAX數據將數據填充到所有其他小部件。

我試圖$.when(selectView()).then(startWidgets).then(popData);

但沒有奏效。我的問題是startWidgets通常在selectView之前運行,但由於沒有HTML標記,它失敗了。我需要他們以特定的順序運行,並且一直到上一個完成纔開始。

回答

1

您需要從selectView歸還承諾的對象,如果不從selectView然後when返回承諾將考慮對象解析並執行成功的處理程序。

此外,我認爲這是最好使用.done()

function mainFunction() { 
    function selectView(){ 
     // do stuff 
     var xhr = $.ajax(....); 
     .... 
     return xhr; 
    } 
    function startWidgets(){ 
     // do stuff 
    } 
    function popData(){ 
     // do stuff 
    } 
    $.when(selectView()).done(startWidgets).done(popData); 
} 
+0

我修改了代碼,並添加代碼來顯示我的AJAX請求是如何完成的,因爲它沒有在selectView函數中完成,因爲它具有它。那有意義嗎? – zen

+0

@zen然後你有一個問題......你需要從'ajaxCall'返回ajaxRequest',並且該值必須從'selectView'返回....如果你可以共享這些方法,我們可以更好看 –

+0

任何在不改變AJAX代碼的情況下按順序運行這3個函數的方法?如果有更好的解決方案,它不必使用'.when()'和'.then()'或'.done()'。 – zen

1

我沒有測試它,但那樣的東西可能幫您解決的回調;)

selectView_done = false; 
startWidgets_done = false; 

function selectView() { 
    // do stuff 
    selectView_done = true; 
    return ...; 
} 

function startWidgets() { 
    // do stuff 
    startWidgets_done = true; 
} 

function popData() { 
    // do stuff 
} 

function control_selectView(){ 
    if(selectView_done){ 
    startWidgets(); 
    control_popData(); 
    } 
    else setTimeout(function(){ control_selectView() }, 100); 
} 

function control_popData(){ 
    if(startWidgets_done) popData(); 
    else setTimeout(function(){ control_popData() }, 100); 
} 

selectView(); 
control_selectView();