node.js - Llamando a una función que devuelve un AsyncIterableIterator sin usar un bloque "for await"
Estoy escribiendo una función de AWS Lambda en TypeScript usando el runtime de Node.js. Estoy usando una función "batchDelete" de una biblioteca ORM de DynamoDB que devuelve un tipo AsyncIterableIterator.
Según la documentación aquí https://github.com/awslabs/dynamodb-data-mapper-js#batchDelete, debo invocar el método con un bucle for await de esta manera:
for await (const found of mapper.batchDelete(toRemove)) {
// items will be yielded as they are successfully removed
}
Todo esto funciona muy bien, pero el problema surge cuando habilito ESLint en mi proyecto. Las reglas predeterminadas generan un error porque el bloque for await está vacío. También recibo una advertencia porque la constante found nunca se utiliza. No tengo uso para la constante found y no quiero registrarla. Me preguntaba si había otra manera de llamar a una función AsyncIterableIterator en la que podamos ignorar lo que se devuelve y no tener el bloque vacío.
Respuesta #1
Si no te importan los resultados de la iteración, entonces probablemente deberías hacer algo como esto:
await Promise.all(toRemove.map(item => mapper.delete(item));
Para usar el resultado de mapper.batchDelete(toRemove) de manera más directa, tienes que permitir múltiples niveles de promesas. Quizás podrías hacer esto:
await Promise.all(await mapper.batchDelete(toRemove)[Symbol.asyncIterator]());
Al hacer esto, await mapper.batchDelete(toRemove)[Symbol.asyncIterator](), eso te daría el iterador asíncrono por defecto y luego pasarlo a Promise.all() iteraría sobre él para obtener un iterable de promesas. Desafortunadamente, al construirlo para facilitar esto:
for await (const found of mapper.batchDelete(toRemove))
Hicieron que fuera un poco más difícil simplemente obtener un array de promesas de ello.
Para tu información, aquí tienes un enlace al código del método .batchDelete() si quieres ver cómo está implementado.
