Ситуация следующая:
Пользователь нажимает кнопку, которая запускает обработчик событий, состоящий из 4 функций. Одна из этих функций выполняет некоторую асинхронную работу и затем входит в каскад синхронных и (в зависимости от варианта использования) асинхронных функций. Код выглядит примерно так:
$('#someButton').Click(function(){
handler();
})
async function handler(){
syncFunction1();
syncFunction2();
await asyncFunction3();
syncFunction4();
}
function asyncFunction3(){
$.post('someUrl',{
//nothing to transmit
}).then((jsonString) => {
parseJSONtoObject(jsonString)
})
}
function parseJSONtoObject(data){
//some Code for Conversion
callCascadeOfFunctions();
}
function callCascadeOfFunctions(){
//some Code which calls other functions
//which call other functions
//and so on
//here is some illustration of what "callCascadeOfFunctions()" does:
//some code
cascadeStep1();
}
function cascadeStep1(){
if(X){
cascadeStep2A
}else{
cascadeStep2B
}
}
//this continues, sometimes the cascade splits, sometimes not.
//at some point we have another AJAX, coming in like this
function cascadeStepN(){
//some code
await sideCascadeWithAJAX
//some code, leading deeper into the cascade where only synchronous
//operations happen
}
}
Теперь очень важно, чтобы handler()
дождался окончания каскада asyncFunction3()
, прежде чем он продолжится.
В другом случае я уже возвратил обещание из глубины каскада функций. Тем не менее, этот код выглядел больше так:
function foo(){
//some code
await someFunctionCascade();
//call to other functions
}
function someFunctionCascade(){
//call to another synchronous function which calls another function etc..
//at the end of the cascade a function does jquery AJAX which creates a promise
//which is returned all the way up through the cascade to the original call
//inside foo()
}
Но на этот раз все немного сложнее, поскольку каскад содержит как синхронные, так и асинхронные части. Он начинается с AJAX, входит в каскад синхронных функций, которые в какой-то момент вызывают асинхронную функцию и ожидают ее завершения, а затем продолжают через некоторые синхронные функции до конца.
Мне действительно нужно объединить все это в "моменты" или я могу обойти это, возвращая обещания от асинхронного вплоть до первоначального вызова?
И если да, сработает ли это «сочетание» тогдашней структуры с передачей обещаний через синхронные секции или это невозможно?