UNPKG

sbis3-node-ws

Version:

Модуль позволяет использовать ядро интерфейсного фреймворка sbis3-ws(`core.js`) и модуль работы с данными (`Source.js`) в приложении на nodejs.

185 lines (174 loc) 6.16 kB
define('js!Core/tmpl/js/helpers/State', function StateLoader() { var State = (function StateFunction() { var setImmediate; if (typeof setImmediate !== 'function') { setImmediate = function setImmediate(func, fate) { 'use strict'; if (typeof setTimeout === 'function') { return setTimeout(function setTimeoutHandler() { func(fate); }, 0); } return func(fate); }; } function enlighten(queue, fate) { queue.forEach(function queueForEach(func) { setImmediate(func, fate); }); } return { make: function make() { var breakers = [], // .when's broken queue fate, // The promise's ultimate value keepers = [], // .when's kept queue status = 'pending'; // 'broken', 'kept', or 'pending' function enqueue( resolution, // 'keep' or 'break' func, // A function that was registered with .when state // A state that provides the resolution functions ) { var queue = resolution === 'keep' ? keepers : breakers; queue[queue.length] = typeof func !== 'function' ? state[resolution]: function enqueueResolution(value) { //try { var result = func(value); if (result && result.is_promise === true) { result.when(state.keep, state.break); } else { state.keep(result); } ////} catch (e) { // throw new Error(e); // state.break(e); //} }; } function herald(state, value, queue) { if (status !== 'pending') { throw "overpromise"; } } function herald(state, value, queue) { if (status !== 'pending') { throw "overpromise"; } fate = value; status = state; enlighten(queue, fate); keepers.length = 0; breakers.length = 0; } return { 'break': function breakPromise(value) { herald('broken', value, breakers); }, keep: function keep(value) { herald('kept', value, keepers); }, promise: { is_promise: true, when: function when(kept, broken) { var state = make(); switch (status) { case 'pending': enqueue('keep', kept, state); enqueue('break', broken, state); break; case 'kept': enqueue('keep', kept, state); enlighten(keepers, fate); break; case 'broken': enqueue('break', broken, state); enlighten(breakers, fate); break; } return state.promise; } } }; }, every: function every(array) { var remaining = array.length, results = [], state = State.make(); if (!remaining) { state.break(array); } else { array.forEach(function everyPromiseEach(promise, i) { promise.when(function everyProiseWhen(value) { results[i] = value; remaining -= 1; if (remaining === 0) { state.keep(results); } }, function everyProiseWhenBroke(reason) { remaining = NaN; state.break(reason); }); }); } return state.promise; }, first: function first(array) { var found = false, remaining = array.length, state = State.make(); function check() { remaining -= 1; if (remaining === 0 && !found) { state.break(); } } if (remaining === 0) { state.break(array); } else { array.forEach(function firstPromiseEach(promise) { promise.when(function firstProiseWhen(value) { if (!found) { found = true; state.keep(value); } check(); }, check); }); } return state.promise; }, any: function any(array) { var remaining = array.length, results = [], state = State.make(); function check() { remaining -= 1; if (remaining === 0) { state.keep(results); } } if (!remaining) { state.keep(results); } else { array.forEach(function anyPromiseEach(promise, i) { promise.when(function anyProiseWhen(value) { results[i] = value; check(); }, check); }); } return state.promise; }, kept: function kept(value) { var state = State.make(); state.keep(value); return state.promise; }, broken: function broken(reason) { var state = State.make(); state.break(reason); return state.promise; } }; }()); return State; });