Veja nesta publicação como implementar o padrão de design compatível com async/await, com a plataforma Magic xpi.
A ideia do async/await pode ser bem compreendida através de várias publicações técnicas sobre o tema, disponíveis na internet.
Mas para resumir o conceito antes de prosseguir, vamos imaginar o seguinte algoritmo:
Uma sequência lógica de ‘n‘ tarefas a executar, umas mais demoradas que outras (como de costume).
A tarefa #2 é a mais demorada de todas para completar e retornar seu valor. E este valor é necessário para executar a tarefa #6.
Mas não é necessário, por exemplo, para executar as tarefas #3, #4 e #5.
De fato (segundo a lógica do processo de negócio proposta nesta questão), foi definido que a tarefa #4 precisa do resultado da tarefa #3, a tarefa #5 precisa do resultado da tarefa #4, mas somente a tarefa #6 (como dito) precisa do resultado da tarefa #2 para completar sua missão.
Assim, entendemos que a tarefa #5 precisa executar “depois” da #4, a tarefa #4 “depois” da #3 e a tarefa #6 “depois” de todas elas (#2, #3, #4 e #5).
Essa sequência de ações é facilmente definida no Magic xpi desta forma:
Um sequência linear de ações na ordem necessária, que produz este resultado quando executado (atente para os tempos de cada ação):
Mas daí, surge a questão: porque esperar a conclusão (mais demorada) da tarefa #2, antes de executar as tarefas #3 , #4 e #5, se o seu resultado só é relevante para a tarefa #6?
É aí que entra o async/await.
A tarefa #2 pode ser executada em paralelo (async) e a tarefa #6 pode requisitar o seu valor/resultado (await) apenas no momento de sua própria execução, quando de fato ele será necessário.
Neste padrão de design, o await garante que o valor requisitado da tarefa async estará disponível quando necessário.
Se ele já estiver disponível no momento da solicitação, o valor é imediatamente coletado e utilizado.
Se ainda não estiver, o await “aguarda” a tarefa async finalizar antes de prosseguir.
*Nota: esse padrão envolve também o conceito de promise, ou seja: seu valor estará lá quando você precisar dele.
E esta ideia (conceito) pode também ser implementada nos fluxos de integração do Magic xpi através dos componentes Post Event e Wait for Event.
Veja a mesma sequência de tarefas (algoritmo) anterior, agora refatorada como async/await:
A tarefa #2, mais demorada, foi iniciada em paralelo (outra thread) assim que possível, enquanto as demais tarefas (#3 até #6) seguiram sua execução (thread atual).
A tarefa #2 “avisa” quando finalizou através do Post Event.
Já na outra thread que seguiu em paralelo, a tarefa #6 (que depende do valor resultante da tarefa #2) não inicia antes de “ser avisada” que ela (tarefa #2) já finalizou.
Esta verificação (e possível espera) é feita pelo Wait for Event.
Observe agora, a diferença de tempos no resultado desta execução:
Embora o tempo individual de cada tarefa não tenha sido alterado, o tempo final (do todo) foi menor, por conta da otimização do que podia ser feito em paralelo (async).
Mas sem prejudicar a dependência que uma tarefa tinha em relação a uma outra (await).
Intercâmbio de dados entre diferentes threads (contextos)
A ideia do await tem fundamento no princípio que ele “precisa” do resultado da execução paralelo (async), antes de continuar. Por isso ele precisa “esperar” caso o valor ainda não exista quando foi solicitado.
O Wait for Event garante a “espera” da conclusão desta tarefa async. Mas e o resultado (valores calculados) dela?
No Magic xpi, esta troca de valores entre os contextos (threads) pode, por exemplo, ser realizada através de um ODS Global.
A tarefa #2 (async) pode guardar seu resultado em uma tag (chave) de ODS Global, de forma que a tarefa #6, conhecendo previamente o nome desta tag, tenha acesso a ela com a função ODSGet() (por exemplo).
Então, a tarefa #2 (async) deve guardar seu resultado “antes” do Post Event, e a tarefa #6 (await) deve recolher este resultado “após” o Wait for Event.
Numa construção semelhante a esta:
Fique ligado aqui no Blog, para mais publicações sobre o Magic xpi.
Para receber os artigos do Blog Magic Brasil em primeira mão no seu email, registre-se aqui