Выполнение одной функции за другой

0

Все эти функции находятся в основной функции, которая вызывается после события 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, он терпит неудачу. Мне нужно, чтобы они выполнялись в определенном порядке, и один не запускается до тех пор, пока предыдущий не будет выполнен.

Теги:
.when

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();
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, как у вас. Имеет ли это смысл?
  • 0
    @zen, тогда у вас есть проблема ... вам нужно вернуть ajaxRequest из ajaxCall и это значение должно быть возвращено из selectView .... если вы можете поделиться этими методами, мы можем лучше посмотреть
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню