13. 问题:异步协作
var proxy = new EventProxy();
proxy.all("template", "data", "l10n", render);
• 嵌套还是并行?
$.get("template", function (template) {
// something
$.get("template", function (template) {
proxy.trigger("template", template);
}); // something
$.get("data", function (data) {
$.get("data", function (data) {
// something
// something
$.get("l10n", function (l10n) {
proxy.trigger("data", data);
}); // something
render(template, data);
$.get("l10n", function (l10n) {
});
// something
});
proxy.trigger("l10n", l10n);
});
});
13
14. 问题:异步还是同步
var proxy = new EventProxy();
var status = "ready";
var _getFile = function (callback) {
• 复杂的异步编程
proxy.once("template", callback);
if (status === "ready") {
fs.readFile("views/index.html", function (err, file) {
status = "pending";
proxy.fire("template", err, file);
});
}
};
var view = fs.readFileSync("../views/index.html", "utf8");
var _template;
var getTemplate = function (callback) {
if (_template) {
callback(null, _template);
} else {
同步 + 缓存,妥妥滴
_getFile(function (err, file) {
if (!err && !_template) {
_template = file.toString();
}
callback(null, _template);
});
}
};
14
15. 问题:缓存的使用
var map = {};
var get = function (key) {
var LimitableMap = require('limitablemap');
return map[key];
}; map = new LimitableMap(1000);
var
map.set("key1", "key1");
var set = function (key, value) {
map.get("key1");
map[key] = value;
};
// 检查缓存
if (!get(key)) {
// 从数据库或别的地方获取了对象后,放进缓存中
set(key, value);
}
15
17. // 正确的方法
var chunks = [];
var size = 0;
问题: Buffer 对象
res.on('data', function (chunk) {
chunks.push(chunk);
size += chunk.length;
});
var data = function () {
res.on('end',
"";
res.on('data', function (chunk) {
var data = null;
//简单且正确的方法 对象
chunk 是一个 Buffer
//switch(chunks.length) {
var bufferHelper = 隐藏的 toString ()
case += chunk;// new BufferHelper();
data 0: data = new Buffer(0);
}) break;
req.on("data", function (chunk) {
case 1: data = chunks[0];
bufferHelper.concat(chunk);
.on("end", function () {
break;
})// 对 data 转码
default:
.on('end', function () {
}); data = new Buffer(size);
var html i= bufferHelper.toBuffer().toString();
for (var = 0, pos = 0, l = chunks.length; i < l; i++) {
var chunk = chunks[i];
}); chunk.copy(data, pos);
pos += chunk.length;
}
break;
} 17
19. 问题:多核 CPU 的利
var cluster = require('node-cluster');
• 用
单线程与多核 CPU
var master = new cluster.Master();
master.register(8080, 'app.js');
• 单线程因为异常退出?
master.dispatch(); 负载均衡
多核利用
• 仿若熟悉的 Web Worker: 提升稳定
var http = require('http');
var cluster = require('node-cluster');
child_process
var worker = new cluster.Worker();
• 进程与消息
var server = http.createServer(function (req, res) {
// server
});
worker.ready(function (socket) {
server.emit('connection', socket);
}); 19