Как стать автором
Обновить

Fybers — легкое программирование на yield

Привет Хабровчане!

Представляю Вашему вниманию библиотеку 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

Всем спасибо за внимание. Комментарии, отзывы, пожелания приветствуются.

Это первый пост и я не знаю дадут ли право мне отвечать в комментариях
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.