Привет Хабровчане!
Представляю Вашему вниманию библиотеку Fybers для легкого программирования на yield в Node.js/Javascript/Harmony.
Я встречал много разных библиотек для асинхронного программирования в ноде и даже использования новой фишки harmony — yield. Тот же co — немного неудобен. Постоянно надо чтото оборачивать. А как мы все знаем — мы, программисты, не любим монотонную работу. Поэтому я искал выход из этой ситуации и я его нашел. Я соединил воедино все разные сособы избавления от callback-hell'а и написал библиотеку.
Конечно весь API был продуман не без помощи Ярослава Погребняка, который помог с требованиями к очень удобному использованию. За что ему отдельно спасибо.
Итак, поехали.
Инсталляция.
Использование.
В папке examples я создал до 10 примеров как ее использовать с разными возможностями.
Тут приведу небольшое API использования
Подключение
Создание фибры:
API фибры
Текущая фибра на исполнении.
Обьект с функциями проверки типов возращаемых данных командой yield. Можно расширять новые проверки, например сделать понимание фиброй промисы и другие библиотеки асинхронного программирования.
Scope фибры, которая будет наследоватся любой последующей фиброй/генератором в ней.
Статус выполнения фибры: initialized | started | done | interrupted
Два параметра — результаты выполнения фибры при статусе 'done'
Родитель, который запустил текущую фибру
Подписка на события работы фибры
Запуск фибры с параметрами. Параметры нужны для фибры на основе функций
Прерывание исполнения фибры с причиной. Прерывание просто не продолжает ее выполнение.
Остановка фибры с внутренней ошибкой. Ошибку можно поймать внутри фибры, а прерывание — нет.
Методы проверки статуса
Время запуска фибры
Время, затраченное процессором, на исполнение фибры
Время общей работы фибры вместе с простоями
Добавление времени к времени использования cpu
Пример работы.
Видео мануал по описанию примеров тут: drive.google.com/file/d/0B3E3RRigSsASZmtJLU9VSDN0UW8/edit?usp=sharing
Исходник на github: github.com/encobrain/fybers
Всем спасибо за внимание. Комментарии, отзывы, пожелания приветствуются.
Представляю Вашему вниманию библиотеку Fybers для легкого программирования на yield в Node.js/Javascript/Harmony.
Я встречал много разных библиотек для асинхронного программирования в ноде и даже использования новой фишки harmony — yield. Тот же co — немного неудобен. Постоянно надо чтото оборачивать. А как мы все знаем — мы, программисты, не любим монотонную работу. Поэтому я искал выход из этой ситуации и я его нашел. Я соединил воедино все разные сособы избавления от callback-hell'а и написал библиотеку.
Конечно весь API был продуман не без помощи Ярослава Погребняка, который помог с требованиями к очень удобному использованию. За что ему отдельно спасибо.
Итак, поехали.
Инсталляция.
npm install fybers
Использование.
В папке examples я создал до 10 примеров как ее использовать с разными возможностями.
Тут приведу небольшое API использования
Подключение
var fyber = require('fybers');
Создание фибры:
function asyncFunction(cb) { cb(null, 10); }
function* generatorFunction() { return 10; }
var generatorInstance = generatorFunction(), thisObj = {};
var fyber = new Fyber(generatorFunction, thisObj);
var fyber = new Fyber(generatorInstance);
var fyber = new Fyber(asyncFunction, thisObj);
API фибры
Fyber.current
Текущая фибра на исполнении.
Fyber.yieldContinues
Обьект с функциями проверки типов возращаемых данных командой yield. Можно расширять новые проверки, например сделать понимание фиброй промисы и другие библиотеки асинхронного программирования.
fyber.scope
Scope фибры, которая будет наследоватся любой последующей фиброй/генератором в ней.
fyber.status
Статус выполнения фибры: initialized | started | done | interrupted
fyber.error
fyber.result
Два параметра — результаты выполнения фибры при статусе 'done'
fyber.parent
Родитель, который запустил текущую фибру
fyber.on('start', function(startArgs){});
fyber.on('started', function(){});
fyber.on('interrupt', function(reason){});
fyber.on('interrupted', function(reason){});
fyber.on('done', function(error, result){});
Подписка на события работы фибры
fyber.start(/* args */);
Запуск фибры с параметрами. Параметры нужны для фибры на основе функций
fyber.interrupt(reason);
Прерывание исполнения фибры с причиной. Прерывание просто не продолжает ее выполнение.
fyber.throw(error);
Остановка фибры с внутренней ошибкой. Ошибку можно поймать внутри фибры, а прерывание — нет.
fyber.isStarted()
fyber.isDone()
fyber.isInterrupted()
Методы проверки статуса
fyber.startTime()
Время запуска фибры
fyber.cpuTime([setTime])
Время, затраченное процессором, на исполнение фибры
fyber.workTime()
Время общей работы фибры вместе с простоями
fyber.addCpuTime(addTime);
Добавление времени к времени использования cpu
Пример работы.
var Fyber = require('fybers');
function* generatorFunction(a,b){
console.log('GeneratorFunction this & args:', this, arguments);
return a * b;
}
function asyncFunction(a,b,cb){
console.log('AsyncFunction this & args:', this, arguments);
setTimeout(function(){
cb(null, a + b);
},1000);
}
console.log('**************** Synchronious usage fybers ***************');
var someObject = {
prop: 25,
asyncFnMethod: function(a, b, cb){
cb(null, a - b * this.prop);
},
generatorFnMethod: function* (a, b){
return a / b + this.prop;
}
};
function* syncWork(a,b){
//gets current fyber
syncWork.fyber;
//gets scope of current fyber
syncWork.scope === syncWork.fyber.scope;
console.log('This & args of syncWork:', this, arguments);
// call async function with some this object
var result1 = yield asyncFunction.call({someThisObj: true}, a, b, syncWork.cb);
console.log('Async function result (30):', result1); // 30
// call generator function with some this object
var result2 = yield generatorFunction.call({someThisObj2: true}, a, b);
console.log('Generator function result (200):', result2); // 200
//call async method of someObject
var result3 = yield someObject.asyncFnMethod(a, b, syncWork.cb);
console.log('Async method result (-490):', result3); // -490
//call generator method of someObject
var result4 = yield someObject.generatorFnMethod(a,b);
console.log('Generator method result (25.5):', result4); // 25.5
return result1 + result2 + result3 + result4;
}
var work = new Fyber(syncWork, {thisObj: true});
work.on('done', function (error, result) {
console.log('syncWork error & result (-234.5):',error, result); // -234.5
});
console.log('Start syncWork...');
work.start(10,20); // start work asynchroniusly
console.log('Started syncWork...');
Видео мануал по описанию примеров тут: drive.google.com/file/d/0B3E3RRigSsASZmtJLU9VSDN0UW8/edit?usp=sharing
Исходник на github: github.com/encobrain/fybers
Всем спасибо за внимание. Комментарии, отзывы, пожелания приветствуются.