虽然这是一个简单的问题,但答案的规模很大!Tim Ruffles本周(2013 年 7 月)在伦敦节点用户组就该主题进行了完整的讲座,该讲座可作为视频讲座 [http://www.youtube.com/watch?v=nHXKA82M-LY] 获得。
这里的问题是如何在异步(无顺序保证)编程环境中处理需要同步(按顺序)完成的事情的基本问题。
在蒂姆用来处理这个问题的方法列表中,有三种方法似乎可以帮助你。
正如其他帖子中所建议的,您可以使用代码中的回调:
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 安装异步。
或者,可能合理地用于此问题的第三种方法是使用 Promise。这些都被很好地接受了,在学习 node 来自其他 javascript 的语言时,我发现这很难适应来自 javascript 之外的其他语言,但是使用 JQuery 的程序员似乎更喜欢这种方法。这里有一个关于如何在 node.js 中使用 Promise 的教程:http: //howtonode.org/promises
当然,蒂姆在他对这些方法的讲座中提供了更深入的分析和比较,并提供了一些关于我们将来如何做到这一点的见解。
您可能还会发现 Express、Restify 和 Restler 模块可用作创建 Restful api 的一种方式。
*免责声明我没有运行此代码,因为我没有安装 mysql - 在这里进行编辑的机会:)