Le chiusure sono grandi per la logica asincrona.
Riguarda principalmente l'organizzazione del codice per me. Avere un sacco di funzioni locali per suddividere ciò che sta facendo il codice è bello.
create: function _create(post, cb) {
// cache the object reference
var that = this;
function handleAll(err, data) {
var rows = data.rows;
var id = rows.reduce(function(memo, item) {
var id = +item.id.split(":")[1];
return id > memo ? id : memo;
}, 0);
id++;
var obj = {
title: post.title,
content: post.content,
id: id,
// refer to the object through the closure
_id: that.prefix + id,
datetime: Date.now(),
type: "post"
}
PostModel.insert(obj, handleInsert);
}
// this function doesn't use the closure at all.
function handleInsert(err, post) {
PostModel.get(post.id, handleGet);
}
// this function references cb and that from the closure
function handleGet(err, post) {
cb(null, that.make(post));
}
PostModel.all(handleAll);
}
Ecco un altro esempio di chiusura
var cachedRead = (function() {
// bind cache variable to the readFile function
var cache = {};
function readFile(name, cb) {
// reference cache
var file = cache[name];
if (file) {
return cb(null, file);
}
fs.readFile(name, function(err, file) {
if (file) cache[name] = file;
cb.apply(this, arguments);
});
}
return readFile;
})();
E un altro esempio
create: function _create(uri, cb, sync) {
// close over count
var count = 3;
// next only fires cb if called three times
function next() {
count--;
// close over cb
count === 0 && cb(null);
}
// close over cb and next
function errorHandler(err, func) {
err ? cb(err) : next();
}
// close over cb and next
function swallowFileDoesNotExist(err, func) {
if (err && err.message.indexOf("No such file") === -1) {
return cb(err);
}
next();
}
this.createJavaScript(uri, swallowFileDoesNotExist, sync)
this.createDocumentFragment(uri, errorHandler, sync);
this.createCSS(uri, swallowFileDoesNotExist, sync);
},
L'alternativa all'utilizzo delle chiusure è la conversione della variabile in funzioni usando f.bind(null, curriedVariable)
.
Generalmente, tuttavia, la logica di programmazione asincrona utilizza i callback e lo stato di manipolazione nei callback fa affidamento su operazioni di curriculum o chiusure. personalmente preferisco le chiusure.
Per quanto riguarda gli usi dell'ereditarietà prototipica, consente OO? L'eredità prototipica deve davvero fare di più che essere considerata "utile". È uno strumento di ereditarietà, consente l'ereditarietà, è abbastanza utile.