La expresión race se usa para ejecutar un bloque de dos o más expresiones asíncronas de manera concurrente (simultáneamente). Cuando se completa la expresión más rápida, “gana la carrera”. Cualquier expresión “perdedora” restante se cancela; luego, cualquier expresión que sigue a la carrera 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 siguiente diagrama muestra el flujo de ejecución de las expresiones.
Uso de la expresión race
Dónde puedes usar una expresión | |
Tiempo de invocación de la expresión | Asíncrono |
Requisitos para el bloque de código | El cuerpo de la expresión |
Qué hace la expresión | Similar a |
Cuando se complete la expresión | La |
Cuando comienza 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 |
Esto puede parecer simple, pero race es una de las expresiones más útiles y poderosas del arsenal de Verse. Es clave para detener cualquier otro código asíncrono arbitrariamente complejo de forma estructurada, una forma de salida anticipada. Lo hace de una manera muy limpia, y mantiene las pruebas necesarias para determinar cuándo parar separadas del código que se va a detener.
Se puede cancelar cualquier expresión asíncrona.
Algunas expresiones asíncronas interminables como
loopoSleep(Inf)nunca se completarán. La única forma de detenerlas es cancelarlas. Esta puede ser una estrategia sólida cuando se combina con una o más expresionesrace.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 una cantidad de tiempo o después de que se desencadene una secuencia compleja de eventos? Sin race, normalmente tendrías que esparcir pruebas, como sondeo, por todo tu comportamiento complejo. Con race, solo tienes que añadir todas las condiciones de parada como subexpresiones del mismo nivel 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 se puede utilizar para determinar qué subexpresión finalizó 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()