Chain

Chain — очень маленькая библиотека для создания цепочек, состоящих
из синхронных и асинхронных функций, для обработки ваших данных.

Также, читайте статью на Хабре.

chain.
  when(storage.get('url'));
  defer(function(data, done) {
    http.get(data[0].url, done);
  }).
  then(function(request) { return request.data; }).
  end();

Скачивание

3.4kb, полный исходный код

2.0kb, сжатая версия

Установка


Для использования Chain в браузере добавьте подключение скрипта на вашу страницу.

<script src="js/chain.dev.js" type="text/javascript"></script>

API


Chain имеет простой программный интерфейс, состоящий всего из 5 функций.

new Chain | Chain()

Конструктор для новой цепи. Возвращает объект, экземпляр класса Chain.
Объект хранит все функции цепи.

var testChain = Chain();

.then(Function) | .then(Array.<Function>)

Добавляет синхронные функции в цепь. В качестве аргумента может быть
как одиночная функция, так и массив функций. Возвращает цепь,
для которой вызван этот метод.

testChain.
  then(function() { return 0; }); // возвращает testChain

.defer(Function) | .defer(Array.<Function>)

Добавляет асинхронную функцию в цепь. В качестве аргумента может быть
как одиночная функция, так и массив функций. Возвращает цепь,
для которой вызван этот метод.

testChain.
  defer(function(n, done) { done(0); });
  // возвращает testChain

.when(Chain) | .when(Array.<Chain>)

Добавляет цепь в цепь. Проще говоря, соединяет две и более цепей в одну.
В качестве аргумента может быть как одиночная цепь, так и массив цепей.
Возвращает цепь, для которой вызван этот метод.

var anotherChain = Chain();

testChain.
  when(anotherChain); // возвращает testChain

.end([Function])

Инициирует выполнение цепи. До вызова этой функции ни одна функция цепи
не будет выполнена. Указанная функция вызывается при завершении
выполнения. Указание функции необязательно. Возвращает цепь,
для которой вызван этот метод.

testChain.
  end(function(result) { console.log(result); });
  // возвращает testChain

Примеры


Простое вычисление:

var calculate = Chain();

calculate.
  then(function() { return 0; }).
  then(function(result) { return result + 5; }).
  then(function(result) { return result + 10; }).
  end(function(result) { console.log(result); }); //выведет 15

Простое вычисление с использованием массива:

var calculate = Chain();

function zero() { return 0; }

function plus5(result) { return result + 5; }

function plus10(result) { return result + 10; }

calculate.
  then([zero, plus5, plus10]).
  end(function(result) { console.log(result); }); //выведет 15

Отложенное вычисление:

var fifteen = Chain();

function log(result) { console.log(result); }

function zero() { return 0; }

function five(result, done) { done(result + 5); }

function ten(result, done) {
  setTimeout(function() {
    done(result + 10);
  }, 500);
}

fifteen.
  then(zero).
  defer(five).
  defer(ten).
  end(log); // выведет 15

Отложенное вычисление с использованием массива:

var fifteen = Chain();

function log(result) { console.log(result); }

function zero() { return 0; }

function plus5(result, done) { done(result + 5); }

function plus10(result, done) {
  setTimeout(function() {
    done(result + 10);
  }, 500);
}

fifteen.
  then(zero).
  defer([plus5, plus10]).
  end(log); // выведет 15

Вычисление с цепочками:

var five = Chain(), ten = Chain();

function log(result) { console.log(result); }

function zero() { return 0; }

function five(result, done) { done(result + 5); }

function ten(result, done) {
  setTimeout(function() {
    done(result + 10);
  }, 500);
}

five.
  then(zero).
  defer(five);

ten.
  then(zero).
  defer(ten);

Chain().
  when(five).
  when(ten).
  end(log); // выведет [5, 10]

Chain().
  when([five, ten]).
  end(log); // выведет [5, 10]

Лицензия


Исходный код распространяется по лицензии MIT.

Идея дизайна - Кто-то там.