Tengo dos tablas con usuarios, donde cada identificación para un usuario es la misma en ambas tablas (no preguntes por qué tengo dos tablas de usuarios). En algún momento, necesito filtrar a los usuarios de la tabla 1, y si cierta condición es verdadera, almaceno una promesa (solicitud de eliminación) para cada usuario en (llamémoslo) tableOnePromises. Hago lo mismo para la mesa 2. Para vaciar la mesa 2, DEBO vaciar primero la mesa uno debido a algunos requisitos. Esto es lo que hice:
let tableOnePromises = []; let tableTwoPromises = []; tableOne.forEach(item => { if(item.deactivated) { const tableOneDeleted = supabase .from("table-one") .delete() .match({id: item.id}); tableOnePromises.push(tableOneDeleted); const tableTwoDeleted = supabase .from("table-two") .delete() .match({id: item.id}); tableOnePromises.push(tableTwoDeleted); } }); await Promise.all(tableOnePromises).then(() => { return Promise.all(tableTwoPromises) }).catch(err => console.log(err));Suponiendo que el código que usa await está dentro de una función async (o en el nivel superior de un módulo), la sintaxis es correcta, pero probablemente no sea lo que usaría (en general, evite mezclar async / await con devoluciones de llamada explícitas a través .then y .catch ), y por separado, probablemente no funcione como esperaba (esto se confirma al decir que su código no se eliminó de table-two ).
Para cualquier valor de id en particular, su código comienza a eliminarse de table-one y luego inmediatamente comienza a eliminarse de table-two sin esperar a que se complete la eliminación en la table-one :
// STARTS the deletion but doesn't wait for it to finish const tableOneDeleted = supabase .from("table-one") .delete() .match({id: item.id}); // ... // Starts deleting from `table-two`, even though the item may still be in `table-one` const tableTwoDeleted = supabase .from("table-two") .delete() .match({id: item.id}); Recuerde que una promesa es solo una forma de observar un proceso asincrónico; en el momento en que tiene la promesa, el proceso que está observando ya está en marcha.¹ Entonces, aunque no espera las promesas de la table-two hasta más tarde, inicia las eliminaciones table-two inmediatamente.
...DEBO vaciar primero la mesa uno debido a algunos requisitos...
Si por "vacío" solo quiere decir que debe asegurarse de haber delete una id particular en table-one antes de hacerlo en la table-two , debe esperar a que se complete la eliminación de la table-one antes de comenzar la eliminación table-two . Pondría eso en una función:
async function deleteItem(id) { await supabase .from("table-one") .delete() .match({id}); await supabase .from("table-two") .delete() .match({id}); }Entonces el código se convierte en:
const promises = []; for (const {deactivated, id} of tableOne) { if (deactivated) { promises.push(deleteItem(id)); } } await Promise.all(promises); // With the `try`/`catch` if desired...o si está bien hacer dos pasadas a través de la matriz:
await Promise.all( // With the `try`/`catch` if desired tableOne.filter(({deactivated}) => deactivated) .map(({id}) => deleteItem(id)) ); ¹ "... para cuando tienes la promesa, el proceso que está observando ya está en marcha". Ese es el caso normal. Desafortunadamente, hay una biblioteca de base de datos de documentos popular que no comienza su trabajo en algo hasta que / a menos que llame then la promesa de hacerlo. Pero eso es una excepción y un antipatrón.