Man bør undgå undergangspyramiden:
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');
Denne prøve viser et resultat, der afhænger af 2 uafhængige beregnede værdier. Hver af disse værdier er forespurgt i doQuery1 og doQuery2. De udføres i rækkefølge, men asynkront.
Dernæst kan du se Q.all(...
som dybest set kalder "dengang" callback på succes. Inden for det tilbagekald udføres beregningen.
Brug af løfter (detaljer :Github Q:løfte til Javascript og wikipedia ) tillade at gøre din kode renere, adskille beregning og håndtering af resultater og flytte tingene rundt.
Se på, hvor nemt det ville være at tilføje "doQuery3" som forudsætning for din beregning!
Og nedenunder "package.json", der hører til prøvekoden:
{
"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"
}
}