Все эти функции находятся в основной функции, которая вызывается после события jQuery async AJAX success, и она запускается каждую секунду. Каждая из трех функций также вызывает определенные функции внутри них.
Это базовый код 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() для загрузки структуры HTML на основе конкретных данных AJAX.
startWidgets()
- Инициализирует виджеты, помещая их в структуру HTML (на основе идентификаторов и классов). Выполняется только в первый раз.
popData()
- popData()
данные ко всем другим виджетам на основе данных AJAX.
Я попробовал $.when(selectView()).then(startWidgets).then(popData);
Но это не сработало. Моя проблема заключается в том, что startWidgets обычно запускается перед selectView, но поскольку нет разметки HTML, он терпит неудачу. Мне нужно, чтобы они выполнялись в определенном порядке, и один не запускается до тех пор, пока предыдущий не будет выполнен.
Я не тестировал его, но что-то подобное может вам помочь;)
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();
Вы должны вернуть объекты обещания 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);
}
ajaxRequest
изajaxCall
и это значение должно быть возвращено изselectView
.... если вы можете поделиться этими методами, мы можем лучше посмотреть