Tutorial sulla promessa di Node.js
Nei tutorial precedenti, avresti visto funzioni di callback che vengono utilizzate per eventi asincroni. Ma a volte le funzioni di callback possono diventare un incubo quando iniziano a essere annidate e il programma inizia a diventare lungo e complesso.
Cosa sono le promesse?
Prima di iniziare con le promesse, rivisitiamo innanzitutto quali sono le funzioni di "callback" in Node.js. Abbiamo visto spesso queste funzioni di callback nei capitoli precedenti, quindi esaminiamone rapidamente una.
L'esempio seguente mostra uno snippet di codice utilizzato per connettersi a a MongoDB database ed eseguire un'operazione di aggiornamento su uno dei record nel database.
- Nel codice precedente, la parte della funzione(err,db) è nota come dichiarazione di una funzione anonima o di callback. Quando MongoClient crea una connessione al file MongoDB database, tornerà alla funzione di callback una volta completata l'operazione di connessione. Quindi, in un certo senso, le operazioni di connessione avvengono in background e, una volta terminate, richiama la nostra funzione di callback. Ricorda che questo è uno dei punti chiave di Node.js per consentire che molte operazioni avvengano contemporaneamente e quindi non impedire a nessun utente di eseguire un'operazione.
- Il secondo blocco di codice è ciò che viene eseguito quando viene effettivamente chiamata la funzione di callback. La funzione di callback aggiorna semplicemente un record nel file our MongoDB Banca dati.
Allora cos’è una promessa? Bene, una promessa è solo un miglioramento delle funzioni di callback in Node.js. Durante il ciclo di vita dello sviluppo, potrebbe esserci un'istanza in cui sarebbe necessario annidare più funzioni di callback insieme. Questo può diventare un po’ complicato e difficile da mantenere ad un certo punto nel tempo. In breve, una promessa è un miglioramento dei callback che mira ad alleviare questi problemi.
Di seguito è mostrata la sintassi di base di una promessa;
var promise = doSomethingAync() promise.then(onFulfilled, onRejected)
- "doSomethingAync" è una qualsiasi funzione di callback o asincrona che esegue un qualche tipo di elaborazione.
- Questa volta, quando si definisce la richiamata, viene restituito un valore chiamato "promessa".
- Quando una promessa viene restituita, può avere 2 output. Ciò è definito dalla clausola "allora". L'operazione può avere successo, come indicato dal parametro "onFulfilled". Oppure può contenere un errore indicato dal parametro "onRejected".
Nota: Quindi l’aspetto chiave di una promessa è il valore restituito. Non esiste il concetto di valore restituito quando si lavora con i normali callback in Node.js. A causa del valore restituito, abbiamo un maggiore controllo su come definire la funzione di callback.
Nel prossimo argomento vedremo un esempio di promesse e come traggono vantaggio dai callback.
Richiami alle promesse
Ora diamo un'occhiata a un esempio di come possiamo utilizzare le "promesse" dall'interno di un'applicazione Node.js. Per utilizzare le promesse in un'applicazione Node.js, è necessario prima scaricare e installare il modulo 'promise'.
Modificheremo quindi il nostro codice come mostrato di seguito, che aggiorna un Employeename nella raccolta 'Employee' utilizzando le promesse.
Passo 1) Installazione dei moduli NPM
Per utilizzare Promises dall'interno di un'applicazione Node JS, è richiesto il modulo Promise. Per installare il modulo promessa, esegui il comando seguente
promessa di installazione di npm
Passo 2) Modificare il codice per includere le promesse
var Promise = require('promise'); var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost/EmployeeDB'; MongoClient.connect(url) .then(function(err, db) { db.collection('Employee').updateOne({ "EmployeeName": "Martin" }, { $set: { "EmployeeName": "Mohan" } }); });
Spiegazione del codice: -
- La prima parte consiste nell'includere il modulo 'promise' che ci consentirà di utilizzare la funzionalità promessa nel nostro codice.
- Ora possiamo aggiungere la funzione "allora" alla nostra funzione MongoClient.connect. Quindi, quando viene stabilita la connessione al database, dobbiamo eseguire lo snippet di codice definito successivamente.
- Infine, definiamo il nostro snippet di codice che svolge il compito di aggiornare EmployeeName del dipendente con il nome "Martin" in "Mohan".
Nota: -
Se ora controlli il contenuto del tuo MongoDB database, scoprirai che se esiste un record con EmployeeName di "Martin", verrà aggiornato in "Mohan".
Per verificare che i dati siano stati inseriti correttamente nel database, è necessario eseguire i seguenti comandi in MongoDB
- Utilizza EmployeeDB
- db.Dipendente.find({NomeDipendente: Mohan })
La prima istruzione garantisce che tu sia connesso al database EmployeeDb. La seconda istruzione cerca il record che contiene il nome del dipendente "Mohan".
Gestire le promesse annidate
Quando si definiscono le promesse, è necessario notare che il metodo “allora” stesso restituisce una promessa. Quindi, in un certo senso, le promesse possono essere annidate o incatenate l’una all’altra.
Nell'esempio seguente, utilizziamo il concatenamento per definire 2 funzioni di callback, entrambe le quali inseriscono un record nel file MongoDB Banca dati.
(Note:: Il concatenamento è un concetto utilizzato per collegare l'esecuzione di metodi tra loro. Supponiamo che la tua applicazione avesse 2 metodi chiamati "metodo A" e "metodo B". E la logica era tale che "metodoB" dovrebbe essere chiamato dopo "metodoA", quindi avresti concatenato l'esecuzione in modo tale che "metodoB" venga chiamato direttamente dopo "metodoA.")
L'aspetto fondamentale da notare in questo esempio è che il codice diventa più pulito, leggibile e gestibile utilizzando promesse annidate.
var Promise = require('promise'); var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost/EmployeeDB'; MongoClient.connect(url) .then(function(db) { db.collection('Employee').insertOne({ Employeeid: 4, EmployeeName: "NewEmployee" }) .then(function(db1) { db1.collection('Employee').insertOne({ Employeeid: 5, EmployeeName: "NewEmployee1" }) }) });
Spiegazione del codice: -
- Stiamo ora definendo 2 clausole “then” che vengono eseguite una dopo l'altra. Nella prima clausola then, stiamo passando il parametro 'db' che contiene la nostra connessione al database. Utilizzeremo quindi la proprietà di raccolta della connessione "db" per inserire record nella raccolta "Employee". Il metodo 'insertOne' viene utilizzato per inserire il documento effettivo nella raccolta Employee.
- Utilizzeremo quindi il 2nd clausola then anche per inserire un altro record nel database.
Se ora controlli il contenuto del tuo MongoDB database, troverai i 2 record inseriti nel file MongoDB Banca dati.
Creazione di una promessa personalizzata
Una promessa personalizzata può essere creata utilizzando un modulo nodo chiamato 'q.' La libreria 'q' deve essere scaricata e installata utilizzando il gestore pacchetti del nodo. Dopo aver utilizzato la libreria 'q', è possibile chiamare il metodo “denodeify” che farà sì che qualsiasi funzione diventi una funzione che restituisce una promessa.
Nell'esempio seguente, creeremo una semplice funzione chiamata "Aggiungi" che aggiungerà 2 numeri. Convertiremo questa funzione in una funzione per restituire una promessa.
Fatto ciò, utilizzeremo la promessa restituita dalla funzione Add per visualizzare un messaggio nel console.log.
Seguiamo i passaggi seguenti per creare la nostra funzione personalizzata per restituire una promessa.
Passo 1) Installazione dei moduli NPM
Per utilizzare 'q' dall'interno di un'applicazione Node JS, è richiesto il modulo 'q'. Per installare il modulo 'q', esegui il comando seguente
installazione npm q
Passo 2) Definire il seguente codice che verrà utilizzato per creare la promessa personalizzata.
Spiegazione del codice: -
- La prima cosa è includere la libreria 'q' utilizzando la parola chiave require. Utilizzando questa libreria, saremo in grado di definire qualsiasi funzione per restituire un callback.
- Stiamo creando una funzione chiamata Aggiungi che aggiungerà 2 numeri definiti nelle variabili a e b. La somma di questi valori verrà memorizzata nella variabile c.
- Stiamo quindi utilizzando la libreria q per denodeificare (il metodo utilizzato per convertire qualsiasi funzione in una funzione che restituisca una promessa) la nostra funzione Add o in alternativa convertire la nostra funzione Add in una funzione che restituisca una promessa.
- Ora chiamiamo la nostra funzione "Aggiungi" e siamo in grado di ottenere un valore di promessa di ritorno grazie al passaggio precedente che abbiamo eseguito di denodeificare la funzione Aggiungi.
- La parola chiave 'then' viene utilizzata per specificare che se la funzione viene eseguita con successo, visualizzare la stringa "Funzione di addizione completata" nel console.log.
Quando viene eseguito il codice precedente, l'output "Funzione di aggiunta completata" verrà visualizzato nel console.log come mostrato di seguito.
Sommario
- L'uso delle funzioni di callback in Node.js presenta i suoi svantaggi. A volte durante il processo di sviluppo, l'uso annidato di funzioni di callback può rendere il codice più confuso e difficile da mantenere.
- La maggior parte dei problemi con le funzioni di callback nidificate possono essere mitigati con l'uso di promesse e generatori in node.js
- Una Promise è un valore restituito da una funzione asincrona per indicare il completamento dell'elaborazione eseguita dalla funzione asincrona.
- Le promesse possono essere annidate l'una nell'altra per migliorare l'aspetto del codice e renderlo più facile da gestire quando una funzione asincrona deve essere chiamata dopo un'altra funzione asincrona.