La expresión race se utiliza para ejecutar un bloque de dos o más expresiones asíncronas de forma concurrente (simultánea). La expresión que se completa antes «gana la carrera». Cualquier expresión «perdedora» restante se cancela y, a continuación, cualquier expresión que siga a race se evalúa.
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)El siguiente código muestra la sintaxis (de la expresión race.
expression0
race:
slow-expression
mid-expression
fast-expression
expression1El diagrama siguiente muestra el flujo de ejecución de las expresiones.
Uso de la expresión `race`
Dónde se puede usar una expresión | |
Hora de invocación de la expresión | Asinc. |
Requisitos del bloque de código de | El cuerpo de la expresión |
Qué hace la expresión | Similar a |
Cuando finaliza la expresión |
|
Cuando se inicia la siguiente expresión después de | Cualquier expresión que siga a la expresión |
Resultado de la expresión | El resultado de una expresión |
Puede parecer simple, pero race es una de las expresiones más útiles y potentes del arsenal de Verse. Es clave para detener otro código asíncrono arbitrariamente complejo de forma estructurada, una forma de salida anticipada. Lo hace de una manera muy limpia, manteniendo las pruebas necesarias para determinar cuándo parar separadas del código que se va a detener.
Cualquier expresión asíncrona puede ser cancelada.
Algunas expresiones asíncronas como un
loopoSleep(Inf)interminables nunca se completarán. Y la única forma de detenerlas es cancelarlas. Esta puede ser una buena estrategia, especialmente si se combina con una o más expresiones derace.Las expresiones asíncronas no tendrán un resultado si se cancelan, por lo que cualquier variable u otra expresión que dependa de una expresión asíncrona cancelada no estaría vinculada.
¿Necesitas detener un comportamiento complejo después de cierto tiempo o después de que se desencadene una secuencia compleja de eventos? Sin race, normalmente tendrías que esparcir pruebas, como el sondeo por todo tu comportamiento complejo. Con race solo tienes que añadir todas las condiciones de parada como subexpresiones hermanas al comportamiento complejo.
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 stopEl resultado de race puede utilizarse para determinar qué subexpresión terminó primero o ganó la carrera.
# 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()