Обслуживание синхронных и асинхронных задач в порядке (последовательности) с помощью $ .queue ()

0

У меня есть некоторые задачи, которые являются синхронными, а другие - асинхронными. Они смешаны, но я хочу выполнить их все в порядке.

Изображение у меня ниже задач синхронно: инициализировать, инициировать, завершать, завершать и под задачей асинхронно: task1, task2

Я хочу, чтобы они выполнялись в следующем порядке: инициализировать, инициировать, task1, task2, завершать, завершать

так как с ним использовать $.queue()? Ниже моей реализации, но она не работает.

Ниже кода задач:

инициализировать, инициировать, завершать и заканчивать работу - это "глупые" функции, поскольку они только печатают сообщения в журнал консоли и в элемент div.

function initialize(next) {

 // Here initialization stuff is done just before starting the entire process: things that are required later during the process
     console.log('Initiating process...');
     postStatus('</br>Initiating process...');

     next();
 }

 function initiate(next) {
     // Here enable/disable buttons are done
     setButtonDisabled(true);


     console.log('Process started.');
     postStatus('Process started <br/>');

     next();
 }


 function finalize(next) {
 // Here things required to be done just before terminating the entire process should be done.
 // Free resources, etc.
       console.log('Finishing process...');
       postStatus('<br/>Finishing process...');

       next();
 }

 function terminate(next) {
 // Here things that need to be done when the entire process finished.
 // Simple things such as those related to UI.
      setButtonDisabled(false);

      console.log('Process terminated.');
      postStatus('<br/>Process terminated.');

      next();
 }

Отдых:

 function core(urlGetData, urlDoTask) {

 getTasks(urlGetData).then(function (response) {
            console.log("Response from getTasks: " + response);
             postResponse(response, "Received GetData results" + JSON.stringify(response));
            if ("fail" === response.status) {
               return fail(response);
            }

            console.log(response);
            return doTasks(response.data, urlDoTask);
      }).then(function () {
            postStatus("Received DoTask results");

            var results = arguments;
            console.log(results);
            for (var i = 0; i < results.length; i++) {
               postResponse(results[i], 'done ' + JSON.stringify(results[i]));
            }
      }).fail(function (err) {
            postStatus("Error: " + JSON.stringify(err));
      });
 }

 function Task1(next) { 
         if ($('#Task1').is(':checked')) {
             core("/MyController/GetDataTask1/", "/MyController/DoTask1/");
         }

         next();
 }

 function Task2(next) {    
   if ($('#Task2').is(':checked')) {
         core("/MyController/GetDataTask2/", "/MyController/DoTask2/");
   }

   next();
 }

При нажатии кнопки я делаю:

  $({}).queue(initialize)
       .queue(initiate)
       .queue(Task1)
       .queue(Task2)
       .queue(finalize)
       .queue(terminate);

но похоже, что они не выполняются так, как в консоли он печатает в следующем порядке:

  1. Сообщения для инициализации
  2. Сообщения для инициирования
  3. Сообщения для Task1
  4. Сообщения для Task2
  5. Сообщения для финализации
  6. Сообщения для завершения
  7. Показывает сообщения о выполнении задачи1
  8. Показывает сообщения о ходе выполнения задачи2
  9. Показывает сообщения о ходе выполнения задачи2
    1. И так далее... задачи mix_1 и task2 progress

потому что task1 и task2 являются асинхронными.... так как это решить? Я хочу неблокирующее решение.

Выход должен быть:

  1. Сообщения для инициализации
  2. Сообщения для инициирования
  3. Выполнение Task1 Показывает сообщения о ходе выполнения задачи1 Завершение выполнения Task1
  4. Сообщения для Task2 Показывает сообщения о ходе выполнения задачи2 Завершение выполнения Task2
  5. Сообщения для финализации
  6. Сообщения для завершения

Как поставить их в очередь (инициализировать, инициировать, task1, task2, завершить и завершить), чтобы они выполнялись в этом порядке? Любая часть кода будет высоко оценена....

Я использую jQuery 10.1.2

Теги:

1 ответ

0

Не нужно вообще использовать $.queue - я считаю, что вы должны сделать все это с помощью .then(), например

initialise().then(initiate).then(task1)...

Просто убедитесь, что ваша первоначальная функция возвращает Promise.

  • 0
    Я перепробовал множество решений, подобных этому, но ни одно из них не работает, поскольку проблема в том, что Task1 и Task2 являются асинхронными задачами ... Как обеспечить инициализацию, возвращающую обещание? (Я очень новичок в jQuery. Извините).
  • 1
    @ user1624552 да, вы можете return $.Deferred().promise() .
Показать ещё 10 комментариев

Ещё вопросы

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