これは単純な質問ですが、答えのサイズは巨大です! Tim Rufflesは、今週 (2013 年 7 月)のLondon Node Users Groupで、ビデオ レクチャー [http://www.youtube.com/watch?v=nHXKA82M-LY]として利用できるこのテーマに関するレクチャーを行いました。
ここでの問題は、非同期 (順序が保証されていない) プログラミング環境で作業しながら、同期的に (順番に) 実行する必要がある何かを処理する方法の基本的な問題です。
ティムがこの問題に対処するために使用する方法のリストには、ここで役立つと思われる 3 つの方法があります。
他の投稿で提案されているように、コードからコールバックを使用できます。
var price = -1;
var userId = 'some user provided value';
var sql = 'SELECT max(price) FROM users WHERE id = ' + connection.escape(userId);
connection.query(sql, function(err, results) {
price = results.price;
//start the server afer the sql connection has called back
server = http.createServer(function (request, response) {
handler(request); //response depend on price
}).listen(8012);
});
ただし、これは「ピラミッド コード」と呼ばれるものにつながり、すぐに管理不能になる可能性があります。
この問題を解決するための私の個人的な好みは、非同期ライブラリ [https://github.com/caolan/async] を使用することです。これには、ノードでのシーケンスの問題を処理するためのツールが含まれています。私がこれを選んだのは、それが私にとって最も直感的な方法だと思われるからです。
var async = require('async');
functon query(callback){
var price = -1;
var userId = 'some user provided value';
var sql = 'SELECT max(price) FROM users WHERE id = ' + connection.escape(userId);
connection.query(sql, function(err, results) {
price = results.price;
callback();
});
}
function boot(callback){
server = http.createServer(function (request, response) {
handler(request); //response depend on price
callback();
}).listen(8012);
}
async.series([query,boot]);
npm install async で async をインストールできます。
または、この問題に合理的に使用できる 3 番目のアプローチは、promise を使用することです。これらは広く受け入れられており、javascript 以外の言語からのノードを学習しているときに、javascript 以外の言語からのノードに適応するのは非常に難しいことがわかりましたが、JQuery を使用するプログラマーはこのアプローチを好むようです。ここに node.js でプロミスを使用する方法のチュートリアルがあります: http://howtonode.org/promises
もちろん、Tim はこれらのアプローチの講義でより詳細な分析と比較を提供し、将来これを行う方法についていくつかの洞察を提供します。
また、Restful API を作成する方法として、Express、Restify、および Restler モジュールが役立つ場合もあります。
*免責事項 mysql がインストールされていないため、このコードを実行していません - ここで編集する機会があります :)