0

これらの関数はすべて、jQuery async AJAX 成功イベントの後に呼び出されるメイン関数にあり、毎秒実行されます。3 つの関数はそれぞれ、その中の特定の関数も呼び出します。

これは私が持っている基本的な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);

しかし、それはうまくいきませんでした。私の問題は、通常、selectView の前に startWidgets が実行されることですが、まだ 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 に答える