Пропустить обещание через каскад функций, «отстающих» от кончика «тогдашних»? - PullRequest
0 голосов
/ 30 августа 2018

Ситуация следующая: Пользователь нажимает кнопку, которая запускает обработчик событий, состоящий из 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, входит в каскад синхронных функций, которые в какой-то момент вызывают асинхронную функцию и ожидают ее завершения, а затем продолжают через некоторые синхронные функции до конца.

Мне действительно нужно объединить все это в "моменты" или я могу обойти это, возвращая обещания от асинхронного вплоть до первоначального вызова? И если да, сработает ли это «сочетание» тогдашней структуры с передачей обещаний через синхронные секции или это невозможно?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

синхронные функции, которые в какой-то момент вызывают асинхронную функцию и ожидают ее завершения

К этому моменту «синхронная функция» больше не является синхронной. Он асинхронный и должен возвращать обещание (для значения результата или для undefined). Он может сделать это либо путем возврата обещания, которое возвращает асинхронный вызов, либо используя then для этого обещания, если оно хочет сделать что-то еще после асинхронного вызова, либо await с помощью обещания.

0 голосов
/ 30 августа 2018
  • cascadeStep1 необходимо вернуть результат из cascadeStep2A и cascadeStep2B. Поскольку все это async функций, они вернут обещание.
  • callCascadeOfFunctions необходимо вернуть результат casecadeStep1.

По сути, как только вы работаете с async функциями или функциями, которые выполняют «дела» с обещаниями, они должны все вернуть обещание. Пока все возвращает обещание, которое разрешается после завершения их внутренней операции, await может вести себя правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...