He leído este código en la documentación de Firestore:
const cityRef = db.collection('cities').doc('SF'); try { const res = await db.runTransaction(async t => { const doc = await t.get(cityRef); const newPopulation = doc.data().population + 1; if (newPopulation <= 1000000) { await t.update(cityRef, { population: newPopulation }); return `Population increased to ${newPopulation}`; } else { throw 'Sorry! Population is too big.'; } }); console.log('Transaction success', res); } catch (e) { console.log('Transaction failure:', e); }pero no puedo entender el propósito de esperar el t.update() de la octava línea.
¿No funcionaría el código de la misma manera sin esperar esa octava línea?
No puedo entender el propósito de esperar el
t.update()de la octava línea. ¿No funcionaría el código de la misma manera sin esperar esa octava línea?
Tienes toda la razón: el método update() (así como los de set() y delete() ) no es asíncrono y no devuelve una Promesa, sino la Transaction .
Cuando llama a la función async js, obtiene un objeto Promise devuelto, que puede informarle sobre PromiseState (si la función finalizó, es tiempo de ejecución) y PromiseResult (valor devuelto de la función).
El hecho de que el objeto Promise haya regresado no le dice que la función terminó su misión.
La palabra clave 'await' hace que su código se detenga hasta que la función asíncrona termine de ejecutarse (similar al método std::thread::join ).
El uso de 'aguardar' con un objeto Promise puede indicarle con certeza que su Promise se ha resuelto, por lo que (si el código no generó una excepción) las líneas posteriores pueden ejecutarse de manera segura, sabiendo que la función asíncrona se ejecutó correctamente.
El uso de await en la promesa t.update es necesario y debe mantenerlo allí, de lo contrario, puede devolver una cadena de éxito para un código que aún se está ejecutando y podría fallar.
Tenga en cuenta que la palabra clave await verifica Promise.PromiseState terminado y evalúa el valor Promise.PromiseResult (indefinido para funciones que no regresan)
Lea también:
JavaScript asíncrono en W3Schools
Función asíncrona en MDN