Разматывать обещания и их обработчики

0

Я хочу запустить последовательность задач, и мне нужно, чтобы они выполнялись по порядку. Когда кнопка (#submitButton) нажата на весь процесс, запускается (функция startAll), поэтому я реализую такую архитектуру:

function startAll()
{
   var startDeferred, highPriorityTasksDeferred, lowPriorityTasksDeferred, finalizeDeferred;

   startDeferred = $.Deferred;

   **highPriorityTasksDeferred= startDeferred.then(initialize).done(initiate); <-- ERROR HERE**

   lowPriorityTasksDeferred= highPriorityTasksDeferred.then(function () {
            console.log('Processing HIGH priority tasks...');
            return highPriorityTasks;
   })
   .done(function () {
            console.log('HIGH priority taks processed.');
   });

   finalizeDeferred= lowPriorityTasksDeferred.then(function () {
            console.log('Processing LOW priority tasks...');
            return lowPriorityTasks;
   })
   .done(function () {
            console.log('LOW priority taks processed.');
   });

   finalizeDeferred.then(finalize).done(terminate);

   // Starts all
   startDeferred.resolve();
}

function initialize() {
    // Things to be initialized just before starting process
    console.log('</br>Initiating process...');

    // Stuff

    return;
}

function initiate() {
    // Once initialized, do simple things
    setButtonDisabled(true);

    console.log('Process started at ' + $.now()+ '<br/>');

    return;
}

function finalize() {
    // Things to be done just before ending process
    // Free resources, etc.
    console.log('<br/>Finishing process...');

    // Stuff

    return;
}

function terminate() {
    // Things to be done once finished is done.
    // Simple things such as those related to UI.
    setButtonDisabled(false);

    console.log('<br/>Process terminated at ' + $.now());

    return;
}

function setButtonDisabled(status) {
    $('#submitButton').prop("disabled", status);
} 

методы high/lowPriorityTasks имеют такую структуру:

function high/lowPriorityTasks() {

    getTasks().then(function (response) {

       // stuff

    }).then(function () {

       // stuff 

    }).fail(function (err) {

       // stuff
    });
}

Выход консоли для этого должен быть:

Initiating process...
Process started at XXX

Processing HIGH priority tasks...
HIGH priority taks processed.

Processing LOW priority tasks...
LOW priority taks processed.

Finishing process...
Process terminated at XXX

Важные примечания:

  1. Функции инициализируют, инициируют, завершают и завершают, их последняя команда - возврат; но я не уверен, что это правильно.
  2. Я использую jQuery 1.10.2 и asp.net MVC 4

Наблюдаемые проблемы:

  1. При его выполнении возникает ошибка времени выполнения, заявляющая, что объект не принимает свойство или метод "затем" в строке выделено жирным шрифтом:

    highPriorityTasksDeferred = startDeferred.then(initialize).done (инициировать);

Первая попытка:

Как сказал Кеннет, скобки после $.Deferred были упущены, поэтому, добавив их $.Deferred(), процесс выполняется, но возникают некоторые проблемы. Похоже, что функции high/lowPriorityTasks не выполняются, поскольку в консоли отображается:

Initiating process...
Process started at XXX


Finishing process...

Process terminated at XXX

Есть идеи? Также я хотел бы знать, если возвращение; в функции инициализировать, инициировать, завершать и заканчивать - это лучший способ сделать это или есть другой лучший вариант.

Вторая попытка:

Некоторые скобки были пропущены для highPriorityTasks и lowPriorityTasks при вызове, так что теперь они выполнены правильно, но проблема в том, что они не выполняются по порядку....

Теги:
scripting
asp.net-mvc-4

1 ответ

1

Вы потеряли скобки после $.Deferred. На данный момент он возвращает отложенную функцию не отложенным объектом.

Измените его на следующее, и оно должно работать:

startDeferred = $.Deferred();
  • 1
    LOL, да. $ Deferred () ...
  • 0
    Вы правы, скобки после $ .Deferred были пропущены. При добавлении их сейчас процесс начинается, но появляются новые проблемы, см. Мой последний обновленный пост в «первой попытке».
Показать ещё 4 комментария

Ещё вопросы

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