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 标记,所以它失败了。我需要它们以特定的顺序运行,并且在前一个完成之前不会开始。

4

2 回答 2

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();
于 2014-09-11T14:21:53.117 回答
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);
}
于 2013-09-26T16:19:33.303 回答