Man bör undvika undergångspyramiden:
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');
Detta exempel visar ett resultat som beror på 2 oberoende beräknade värden. Vart och ett av dessa värden efterfrågas i doQuery1 och doQuery2. De exekveras i sekvens, men asynkront.
Därefter kan du se Q.all(...
som i princip kallar "då" callback på framgång. Inom den återuppringningen görs beräkningen.
Använda löften (detaljer :Github Q:löfte för Javascript och wikipedia ) tillåter att göra din kod renare, separera beräkning och hantering av resultat och flytta runt saker.
Titta på hur lätt det skulle vara att lägga till "doQuery3" som förutsättning för din beräkning!
Och nedan "package.json" som hör till exempelkoden:
{
"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"
}
}