2013-09-26 77 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();