Der race expression wird verwendet, um einen block von zwei oder mehr async Ausdrücken gleichzeitig (simultan) auszuführen. Wenn der schnellste Ausdruck abgeschlossen ist, „gewinnt er das Rennen“. Alle verbleibenden „verlorenden“ Ausdrücke werden abgebrochen, dann wird jeder Ausdruck, der auf das race folgt, evaluated.
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)Der folgende Code zeigt die syntax für den race-Ausdruck.
expression0
race:
slow-expression
mid-expression
fast-expression
expression1Das folgende Diagramm zeigt den execution-Ablauf der Ausdrücke.
Race-Ausdruck verwenden
Wo du einen | |
Aufrufzeit des | Async |
Anforderungen für den | Der Körper des |
Was der | Ähnlich wie |
Wenn der | Das |
Wenn der nächste Ausdruck nach dem | Jeder Ausdruck, der auf den |
Ergebnis des | Das Ergebnis eines |
Das mag einfach erscheinen, aber race ist einer der nützlichsten und mächtigsten Ausdrücke im Verse-Arsenal. Es ist der Schlüssel, um die anderen beliebig komplexen asynchronen Codes auf strukturierte Weise anzuhalten – eine Form des vorzeitigen Ausstiegs. Dies geschieht auf eine sehr saubere Art und Weise, indem jeder Test, der notwendig ist, um zu bestimmen, wann gestoppt werden soll, von dem zu stoppenden Code getrennt abläuft.
Jeder asynchrone Ausdruck kann abgebrochen werden.
Einige asynchrone Ausdrücke, wie z. B. eine Endlosschleife
loopoderSleep(Inf)werden nie abgeschlossen. Der einzige Weg, um sie zu stoppen, besteht darin, cancel auszuführen. Wenn es mit einem oder mehrerenrace-Ausdrücken gepaart wird, kann dies eine starke Strategie sein.Asynchrone Ausdrücke werden kein result haben, wenn sie abgebrochen werden, sodass jede Variable oder jeder andere Ausdruck, der von einem abgebrochenen asynchronen Ausdruck abhängt, nicht bound sein würde.
Musst du ein komplexes Verhalten nach einer bestimmten Zeit oder nachdem eine komplexe Abfolge von Eventen ausgelöst wurde anhalten? Ohne race müsstest du normalerweise Tests wie zum Beispiel polling über dein gesamtes komplexes Verhalten verteilen. Mit race musst du nur alle Stopp-Bedingungen dem komplexen Verhalten als gleichberechtigte Unterausdrücke hinzufügen.
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 stopEin race-Ergebnis kann verwendet werden, um festzustellen, welche subexpression zuerst fertig war, oder das Rennen gewonnen hat.
# 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()