У меня есть некоторые задачи, которые являются синхронными, а другие - асинхронными. Они смешаны, но я хочу выполнить их все в порядке.
Изображение у меня ниже задач синхронно: инициализировать, инициировать, завершать, завершать и под задачей асинхронно: 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);
но похоже, что они не выполняются так, как в консоли он печатает в следующем порядке:
потому что task1 и task2 являются асинхронными.... так как это решить? Я хочу неблокирующее решение.
Выход должен быть:
Как поставить их в очередь (инициализировать, инициировать, task1, task2, завершить и завершить), чтобы они выполнялись в этом порядке? Любая часть кода будет высоко оценена....
Я использую jQuery 10.1.2
Не нужно вообще использовать $.queue
- я считаю, что вы должны сделать все это с помощью .then()
, например
initialise().then(initiate).then(task1)...
Просто убедитесь, что ваша первоначальная функция возвращает Promise.
return $.Deferred().promise()
.