È importante gestire il ciclo di vita di una funzione per garantire che si risolva correttamente. Terminando correttamente le funzioni, è possibile evitare addebiti eccessivi dovuti a funzioni che vengono eseguite troppo a lungo o che si ripetono all'infinito. Inoltre, puoi assicurarti che l'istanza di Cloud Functions che esegue la tua funzione non si arresti prima che la funzione raggiunga correttamente la condizione o lo stato di terminazione.
Utilizza questi approcci consigliati per gestire il ciclo di vita delle tue funzioni:
- Risolvi le funzioni che eseguono l'elaborazione asincrona (nota anche come "funzioni in background") restituendo una promessa JavaScript .
- Termina le funzioni HTTP con
res.redirect()
,res.send()
ores.end()
. - Terminare una funzione sincrona con un
return;
dichiarazione.
Semplifica il codice asincrono con le promesse JavaScript
Le promesse sono un'alternativa moderna ai callback per il codice asincrono. Una promessa rappresenta un'operazione e il valore futuro che potrebbe restituire. Consente inoltre di propagare errori simili a try/catch nel codice sincrono. Puoi leggere le promesse nell'SDK di Firebase su The Firebase Blog e le promesse in generale su MDN .
Come funzionano le promesse con le funzioni
Quando restituisci una promessa JavaScript a una funzione, quella funzione continua a funzionare finché la promessa non viene risolta o rifiutata. Per indicare che una funzione ha completato il proprio lavoro con successo, la promessa dovrebbe essere risolta. Per indicare un errore, la promessa dovrebbe essere respinta. Ciò significa che devi solo gestire gli errori che desideri.
Il codice seguente prende un ref
del database in tempo reale Firebase e ne imposta il valore su "world!"
. Restituendo il risultato di set
, è garantito che la funzione continui a essere eseguita fino al completamento del lavoro asincrono di scrittura della stringa nel database:
// Always change the value of "/hello" to "world!"
exports.hello = functions.database.ref('/hello').onWrite(event => {
// set() returns a promise. We keep the function alive by returning it.
return event.data.ref.set('world!').then(() => {
console.log('Write succeeded!');
});
});
Esempi nel contesto
La maggior parte dei nostri esempi di codice di Cloud Functions include esempi di terminazione corretta della funzione. Eccone alcuni che dimostrano casi tipici:
- Trigger del database in tempo reale : una funzione HTTP seguita da un reindirizzamento
- Trigger Cloud Storage : un download di archiviazione seguito da
then
- Webhook sulla scrittura del database in tempo reale : un errore generato all'interno di una clausola
then
- Elimina periodicamente gli account inutilizzati : una promessa rifiutata