Penutupan bagus untuk logika asinkron.
Ini terutama tentang pengorganisasian kode untuk saya. Memiliki banyak fungsi lokal untuk membagi apa yang dikerjakan kode itu bagus.
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);
}
Berikut ini contoh lain dari penutupan
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;
})();
Dan contoh lainnya
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);
},
Alternatif untuk menggunakan closure adalah mengubah variabel menjadi fungsi menggunakan f.bind(null, curriedVariable)
.
Namun secara umum, logika pemrograman asinkron menggunakan panggilan balik dan memanipulasi keadaan dalam panggilan balik bergantung pada currying atau penutupan. secara pribadi saya lebih suka penutupan.
Adapun penggunaan pewarisan prototypical, memungkinkan OO? Apakah warisan prototipe benar-benar perlu melakukan lebih dari itu agar dianggap "berguna". Ini alat warisan, memungkinkan warisan, itu cukup berguna.