L' espressione race viene utilizzata per eseguire un blocco di due o più espressioni asincrone contemporaneamente. Quando l'espressione più veloce termina, "la gara viene vinta". Eventuali espressioni "perdenti" rimanenti vengono annullate, quindi viene valutata qualsiasi espressione che segue race .
set WinnerResult = race:
# All three async functions start at the same time
AsyncFunctionLongTime()
AsyncFunctionShortTime() # This will win and its result is used
AsyncFunctionMediumTime()
# Next expression is called after the fastest async function completes
# / when the fastest/shortest async function task (AsyncFunctionShortTime()) completes
# and all other async function tasks (AsyncFunctionLongTime(), AsyncFunctionMediumTime()) are canceled.
NextExpression(WinnerResult)Il codice seguente mostra la sintassi dell'espressione race.
expression0
race:
slow-expression
mid-expression
fast-expression
expression1Il diagramma seguente mostra il flusso di esecuzione delle espressioni.
Utilizzo dell'espressione race
Dove è possibile utilizzare un'espressione | |
Tempo di invocazione dell'espressione | Asincrono |
Requisiti per il blocco di codice | Il corpo dell'espressione |
Che cosa fa l'espressione | Simile a |
Al termine dell'espressione | La |
Quando inizia l'espressione successiva a | Qualsiasi espressione che segue l'espressione |
Risultato dell'espressione | Il risultato di una |
Può sembrare una cosa semplice, ma race è una delle espressioni più utili e potenti dell'arsenale di Verse. È un keyframe fondamentale per arrestare altro codice asincrono arbitrariamente complesso in modo strutturato, una forma di uscita anticipata. Lo fa in modo molto pulito, mantenendo tutti i test necessari per determinare quando arrestarli separati dal codice che deve essere interrotto.
Qualsiasi espressione asincrona può essere annullata.
Alcune espressioni asincrone, come ad esempio un
loopinfinito oSleep(Inf), non verranno mai completate. L'unico modo in cui possono essere arrestate è annullarle. Questa può essere una strategia efficace se associata a una o più espressionirace.Le espressioni asincrone non avranno un risultato se sono annullate, quindi qualsiasi variabile o altra espressione che dipende da un'espressione asincrona non sarebbe limite.
Hai bisogno di interrompere un comportamento complesso dopo un certo periodo di tempo o dopo una sequenza complessa di attivatore eventi? Senza race, normalmente dovresti eseguire test a pioggia, come ad esempio il polling di tutti, durante il tuo comportamento complesso. Con race, devi solo aggiungere tutte le condizioni di stop come sottoespressioni fratello al comportamento complesso.
race:
ComplexBehavior() # Could be simple or as complex as a whole game
Sleep(60.0) # Timeout after one minute
EventTrigger() # Some other arbitrary test that can be used to stopUn risultato race può essere utilizzato per determinare quale sottoespressione è arrivata per prima o ha vinto la race.
# Adding a unique result to subexpressions so it can
# be used to determine which subexpression won
Winner := race:
block: # task 1
AsyncFunction1()
1
block: # task 2
AsyncFunction2a()
AsyncFunction2b()
AsyncFunction2c()