¿Puede una función en la nube ejecutar trabajo asíncrono de manera segura después de haber cumplido su promesa? Considere el siguiente patrón:
exports.deleteUser = functions.auth.user().onDelete(async (user) => { const uid = user.uid; asyncTask1(uid); asyncTask2(uid); // don't wait for the last task to finish asyncTask3(uid); // just attempt them all and handle asyncTask4(uid); // the failures individually later return Promise.resolve(uid); }); async function asyncTask1(uid) { try { await someAsyncWork(); return Promise.resolve(true); } catch (error) { throw new functions.https.HttpsError("unknown", "Task 1 failed.", error); } }¿Debería evitarse este patrón en Cloud Functions? Mi preocupación es que la instancia que se inicializó para ejecutar esta llamada podría desasignarse antes de que las tareas tengan la oportunidad de finalizar, ya que la función que inicializó la instancia devolvió una promesa casi inmediatamente después de la llamada. ¿O el servidor mantendrá viva esta instancia para permitir que finalice el trabajo asíncrono aunque la función principal ya haya terminado?
Lo que está ilustrando fallará de manera confiable por la razón que indicó. La promesa final devuelta debe resolverse solo después de que todas las demás promesas se hayan resuelto; de lo contrario, es posible que el trabajo no se complete. Cloud Functions no realiza "trabajo en segundo plano" después de que se resuelve la promesa devuelta. Si necesita continuar con algún trabajo sin que la función termine por completo, deberá transferirlo a algún otro servicio informático (que probablemente también tendrá que pagar).