Buscando un enfoque eficaz para enviar más de 1000 solicitudes en lotes, por ejemplo, 6 en paralelo, y cuando estas 6 se hayan completado, envíe las siguientes 6
El envío por lotes evitará que la cola de solicitudes del navegador bloquee por completo cualquier otra solicitud de API que pueda ocurrir mientras las llamadas por lotes están en curso.
He hecho esto anteriormente con RxJS (ejemplo a continuación), pero me pregunto si existe un enfoque basado en Promise de fetch equivalente.
// Array of observables const urls = [ this.http.get('url1'), this.http.get('url2'), this.http.get('url3'), ... ]; bufferedRequests(urls) { from(urls).pipe( bufferCount(6), concatMap(buffer => forkJoin(buffer)) ).subscribe( res => console.log(res), err => console.log(err), () => console.log('complete') ); }Usé cuello de botella hace un tiempo.
Le permite embotellar sus solicitudes con un limitador de tasa del lado del cliente. Puede elegir cuántas solicitudes enviar por minuto y cuántas simultáneas se pueden ejecutar también.
Puede configurar un limiter :
const limiter = new Bottleneck({ maxConcurrent: 1, minTime: 333 //this will execute 3 requests every second, aka wait 333 ms to execute the next request });luego envuelve tu función con ella.
const wrapped = limiter.wrap(myFunction); wrapped(arg1, arg2) .then((result) => { /* handle result */ });En su caso, escribiría una función que se ajuste a las solicitudes de búsqueda y devuelva una promesa. Luego, envolvería eso con el limitador. Aquí hay un ejemplo:
const throttledGetMyData = limiter.wrap(yourFetchFunction); const allThePromises = requests.map(item => { return throttledGetMyData(request); }) try { const results = await Promise.all(allThePromises); console.log(results); } catch (err) { console.log(err); } }