È importante gestire il ciclo di vita di una funzione per assicurarsi che venga risolta correttamente. Terminando le funzioni in modo corretto, puoi evitare addebiti eccessivi da funzioni che vengono eseguite troppo a lungo o che entrano in un loop infinito. Inoltre, puoi assicurarti che l'istanza Cloud Functions che esegue la funzione non venga arrestata 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 (note anche come "funzioni in background") restituendo una promessa JavaScript.
- Termina le funzioni HTTP con
res.redirect(),res.send()ores.end(). - Termina una funzione sincrona con un'istruzione
return;.
Semplificare il codice asincrono con le promesse JavaScript
Le promesse sono un'alternativa moderna alle callback per il codice asincrono. Una promessa rappresenta un'operazione e il valore futuro che potrebbe restituire. Ti consente inoltre di propagare gli errori in modo simile a try/catch nel codice sincrono. Puoi leggere le promesse nell'SDK 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, questa continua a essere eseguita finché la promessa non viene risolta o rifiutata. Per indicare che una funzione ha completato correttamente il suo lavoro, la promessa deve essere risolta. Per indicare un errore, la promessa deve essere rifiutata. Ciò significa che devi gestire solo gli errori che vuoi.
Il seguente codice accetta un Firebase Realtime Database ref e imposta il relativo valore su
"world!". Restituendo il risultato di set, la funzione continuerà a essere eseguita finché il lavoro asincrono di scrittura della stringa nel database non sarà completato:
// 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 Cloud Functions esempi di codice di Cloud Functions include esempi di terminazione corretta delle funzioni. Ecco alcuni esempi che illustrano i casi tipici:
- Trigger di Realtime Database: una funzione HTTP seguita da un reindirizzamento
- Trigger di Cloud Storage:
un download di archiviazione seguito da
then - Webhook sulla scrittura di Realtime Database
:
un errore generato all'interno di una clausola
then - Eliminare periodicamente gli account inutilizzati: una promessa rifiutata