Генераторы являются частью нововведений javascript 1.7 и давно поддерживаются в firefox. О генераторах можно почитать тут, тут и тут.
Сравнительно недавно была добавлена поддержка генераторов в V8, а следовательно и в chrome canary, а также в node.js 0.11, при этом node.js необходимо запускать либо с ключом --harmony, либо c --harmony-generators.
Существует множество способов для борьбы с колбеками в node.js, такие как файберы, вариации с event emitter. Наибольшую популярность получили промисы, на мой взгляд, благодаря наиболее понятным и прозрачным механизмам, заложенным в них. Однако, генераторы предоставляют еще более элегантные способы организации когда. И вот пример:
Интересно? Не безызвестный TJ Holowaychuk написал библиотечку Co, которая позволяет делать вещи вроде таких:
Теперь обработка исключений в асинхронных вызовах станет надежнее.
Подробее в записи https://medium.com/code-adventures/174f1fe66127
Оффтоп: полученный код на node.js имеет много общего с кодом на tornado и это хоршо.
Сравнительно недавно была добавлена поддержка генераторов в V8, а следовательно и в chrome canary, а также в node.js 0.11, при этом node.js необходимо запускать либо с ключом --harmony, либо c --harmony-generators.
Существует множество способов для борьбы с колбеками в node.js, такие как файберы, вариации с event emitter. Наибольшую популярность получили промисы, на мой взгляд, благодаря наиболее понятным и прозрачным механизмам, заложенным в них. Однако, генераторы предоставляют еще более элегантные способы организации когда. И вот пример:
var fs = require('fs');
function thread(fn) {
var gen = fn();
function next(err, res) {
var ret = gen.next(res);
if (ret.done) return;
ret.value(next);
}
next();
}
thread(function *(){
var a = yield read('Readme.md');
var b = yield read('package.json');
console.log(a);
console.log(b);
});
function read(path) {
return function(done){
fs.readFile(path, 'utf8', done);
}
}
Интересно? Не безызвестный TJ Holowaychuk написал библиотечку Co, которая позволяет делать вещи вроде таких:
co(function *(){
var str = yield read(‘Readme.md’);
str = str.replace(‘Something’, ‘Else’);
yield write(‘Readme.md’, str);
});
Теперь обработка исключений в асинхронных вызовах станет надежнее.
co(function *(){
try {
var str = yield read(‘Readme.md’);
} catch (err) {
// whatever
}
str = str.replace(‘Something’, ‘Else’);
yield write(‘Readme.md’, str);
});
Подробее в записи https://medium.com/code-adventures/174f1fe66127
Оффтоп: полученный код на node.js имеет много общего с кодом на tornado и это хоршо.