Я хочу запустить последовательность задач, и мне нужно, чтобы они выполнялись по порядку. Когда кнопка (#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
Важные примечания:
Наблюдаемые проблемы:
При его выполнении возникает ошибка времени выполнения, заявляющая, что объект не принимает свойство или метод "затем" в строке выделено жирным шрифтом:
highPriorityTasksDeferred = startDeferred.then(initialize).done (инициировать);
Первая попытка:
Как сказал Кеннет, скобки после $.Deferred были упущены, поэтому, добавив их $.Deferred(), процесс выполняется, но возникают некоторые проблемы. Похоже, что функции high/lowPriorityTasks не выполняются, поскольку в консоли отображается:
Initiating process...
Process started at XXX
Finishing process...
Process terminated at XXX
Есть идеи? Также я хотел бы знать, если возвращение; в функции инициализировать, инициировать, завершать и заканчивать - это лучший способ сделать это или есть другой лучший вариант.
Вторая попытка:
Некоторые скобки были пропущены для highPriorityTasks и lowPriorityTasks при вызове, так что теперь они выполнены правильно, но проблема в том, что они не выполняются по порядку....
Вы потеряли скобки после $.Deferred
. На данный момент он возвращает отложенную функцию не отложенным объектом.
Измените его на следующее, и оно должно работать:
startDeferred = $.Deferred();