Sincronizzazione, asincroni e promesse

È importante gestire il ciclo di vita di una funzione per garantire che si risolva correttamente. Se termini le funzioni correttamente, puoi evitare addebiti eccessivi da funzioni che vengono eseguite per troppo tempo o in loop infinito. Inoltre, puoi assicurarti che l'istanza Cloud Functions che esegue la 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 funzioni:

  • Risolvere le funzioni che eseguono l'elaborazione asincrona (nota anche come "funzioni in background") restituendo un JavaScript la promessa.
  • Termina le funzioni HTTP con res.redirect(), res.send() o res.end().
  • Termina una funzione sincrona con un'istruzione return;.

Semplifica il codice asincrono con le promesse di 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. Ti consente inoltre propagare errori simili a trial/catch nel codice sincrono. Puoi leggere informazioni sulle promesse nell'SDK Firebase sul blog di Firebase e sulle promesse in generale su MDN.

Come funzionano le promesse con le funzioni

Quando restituisci una promessa JavaScript a una funzione, questa funzione rimane in esecuzione finché la promessa non viene risolta o rifiutata. Per indicare che ha completato correttamente il proprio funzionamento, la promessa dovrebbe 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 ref Firebase Realtime Database e imposta il suo valore su "world!". Se restituisci il risultato di set, la funzione garantisce continuerà a essere eseguito fino a quando il lavoro asincrono di scrittura della stringa nel database è completamente completata:

// 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 codici di esempio include esempi di terminazione corretta delle funzioni. Ecco alcuni esempi di casi tipici: