Si dovrebbe evitare la piramide del destino:
var express = require('express');
var Q = require('Q');
var app = express();
app.get('/',function(req,res){
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : ''
});
connection.connect();
function doQuery1(){
var defered = Q.defer();
connection.query('SELECT 1 AS solution',defered.makeNodeResolver());
return defered.promise;
}
function doQuery2(){
var defered = Q.defer();
connection.query('SELECT 2 AS solution',defered.makeNodeResolver());
return defered.promise;
}
Q.all([doQuery1(),doQuery2()]).then(function(results){
res.send(JSON.stringify(results[0][0][0].solution+results[1][0][0].solution));
// Hint : your third query would go here
});
connection.end();
});
app.listen(80);
console.log('Listening on port 80');
Questo esempio mostra un risultato che dipende da 2 valori calcolati indipendenti. Ciascuno di questi valori viene interrogato in doQuery1 e doQuery2. Vengono eseguiti in sequenza, ma in modo asincrono.
Successivamente puoi vedere Q.all(...
che fondamentalmente chiamano il callback "allora" in caso di successo. All'interno di tale richiamata, il calcolo viene eseguito.
Utilizzo delle promesse (dettagli:Github Q:promise for Javascript e wikipedia ) consentono di rendere il codice più pulito, separare il calcolo e la gestione dei risultati e spostare le cose.
Guarda come sarebbe facile aggiungere "doQuery3" come prerequisito per il tuo calcolo!
E sotto il "package.json" che suona al codice di esempio:
{
"name": "hello-world",
"description": "hello world test app",
"version": "0.0.1",
"private": true,
"dependencies": {
"express": "3.2.0",
"q": "0.9.3",
"mysql":"2.0.0-alpha7"
}
}