Escribí una API a la que llaman varios clientes y calcula su solicitud. Aproximadamente se ve así:
async function main(request){ url = //extractUrlFromRequest answer = await compute(url) } async function compute(url){ answer = await fetch(url) //other computations return answer } Tenga en cuenta que diferentes clientes pueden llamar a la función main varias veces por segundo o incluso al mismo tiempo y que el tiempo de compute de la función de cálculo puede variar según la solicitud (hasta ~2 segundos).
El problema
El problema es que si una llamada de compute() no finaliza antes de que llegue la siguiente llamada de compute() , la fetch() de la segunda llamada anulará la fetch() de la primera llamada sin importar en qué parte del código se encuentre actualmente ( Los parámetros en el encabezado, es decir, la url , no cambian).
Ejemplo: comportamiento esperado
compute() la primera vez -> fetch() devuelve "hola" -> continúa el cálculocompute() la segunda vez -> fetch() devuelve "mundo" -> continúa el cálculocompute() termina -> devuelve "hola"compute() termina -> devuelve "mundo"Ejemplo: comportamiento observado
compute() la primera vez -> fetch() devuelve "hola" -> continúa el cálculocompute() la segunda vez -> fetch() devuelve "mundo" y reemplaza "hola" de la primera llamada con "mundo" -> continúa el cálculocompute() termina -> devuelve "mundo"compute() termina -> devuelve "mundo"¿Qué puedo hacer para lograr el comportamiento esperado?
lo que he intentado
He leído en MDN que Promise.all se puede usar para ejecutar varias promesas / esperas a la vez, sin embargo, este no es exactamente mi caso de uso ya que no tengo todas las solicitudes al principio, sino que entran una tras otra y llaman al main() vuelva a funcionar.
He leído que javascript es fundamentalmente de subproceso único/lineal, ¿es posible lograr los resultados esperados o elegí el idioma incorrecto para este proyecto?