Beispiel #1
0
    map: function(modelName, source) {
        var _this = this,
            promise = Vow.isPromise(source) ? source : Vow.promise(source),
            schema = require('../../models/' + modelName + '/' + modelName + '.map.js'),
            result = {};

        return promise.then(function(data) {

            Object.keys(schema).forEach(function(field) {
                var rule = schema[field],
                    ctxType = typeof rule,
                    val;

                if ((ctxType === 'string') || (ctxType === 'function')) {
                    rule = { type: 'simple', ctx: rule };
                } else {
                    ctxType = typeof rule.ctx;
                }

                val = ctxType === 'string' ? data[rule.ctx] : rule.ctx(data);

                if (rule.type === 'model') {
                    result[field] = _this.map(rule.model, val);
                } else if (rule.type === 'collection' && val instanceof Array) {
                    result[field] = Vow.all(val.map(function(item) {
                        return _this.map(rule.model, item);
                    }));
                } else {
                    result[field] = val;
                }
            });

            return Vow.all(result);
        });
    }
Beispiel #2
0
 /**
  * Выполнить асинхронную функцию
  * @param {Function} [func=_emptyAsyncFn] - функция
  * @param {*} [ctx=this] - контекст выполнения @func
  * @returns {Promise}
  * @private
  */
 function _async(func, ctx) {
     func = func || _emptyAsyncFn;
     ctx = ctx || this;
     var defer = vow.defer(),
         args = Array.prototype.slice.call(arguments, 2);
     args.unshift(defer);
     var result = func.apply(ctx, args);
     return vow.isPromise(result)? result: defer.promise();
 }
Beispiel #3
0
(function(global){var undef,nextTick=function(){var fns=[],enqueueFn=function(fn){return fns.push(fn)===1},callFns=function(){var fnsToCall=fns,i=0,len=fns.length;fns=[];while(i<len){fnsToCall[i++]()}};if(typeof setImmediate==="function"){return function(fn){enqueueFn(fn)&&setImmediate(callFns)}}if(typeof process==="object"&&process.nextTick){return function(fn){enqueueFn(fn)&&process.nextTick(callFns)}}if(global.postMessage){var isPostMessageAsync=true;if(global.attachEvent){var checkAsync=function(){isPostMessageAsync=false};global.attachEvent("onmessage",checkAsync);global.postMessage("__checkAsync","*");global.detachEvent("onmessage",checkAsync)}if(isPostMessageAsync){var msg="__promise"+ +new Date,onMessage=function(e){if(e.data===msg){e.stopPropagation&&e.stopPropagation();callFns()}};global.addEventListener?global.addEventListener("message",onMessage,true):global.attachEvent("onmessage",onMessage);return function(fn){enqueueFn(fn)&&global.postMessage(msg,"*")}}}var doc=global.document;if("onreadystatechange"in doc.createElement("script")){var createScript=function(){var script=doc.createElement("script");script.onreadystatechange=function(){script.parentNode.removeChild(script);script=script.onreadystatechange=null;callFns()};(doc.documentElement||doc.body).appendChild(script)};return function(fn){enqueueFn(fn)&&createScript()}}return function(fn){enqueueFn(fn)&&setTimeout(callFns,0)}}(),throwException=function(e){nextTick(function(){throw e})},isFunction=function(obj){return typeof obj==="function"},isObject=function(obj){return obj!==null&&typeof obj==="object"},toStr=Object.prototype.toString,isArray=Array.isArray||function(obj){return toStr.call(obj)==="[object Array]"},getArrayKeys=function(arr){var res=[],i=0,len=arr.length;while(i<len){res.push(i++)}return res},getObjectKeys=Object.keys||function(obj){var res=[];for(var i in obj){obj.hasOwnProperty(i)&&res.push(i)}return res},defineCustomErrorType=function(name){var res=function(message){this.name=name;this.message=message};res.prototype=new Error;return res},wrapOnFulfilled=function(onFulfilled,idx){return function(val){onFulfilled.call(this,val,idx)}};var Deferred=function(){this._promise=new Promise};Deferred.prototype={promise:function(){return this._promise},resolve:function(value){this._promise.isResolved()||this._promise._resolve(value)},reject:function(reason){if(this._promise.isResolved()){return}if(vow.isPromise(reason)){reason=reason.then(function(val){var defer=vow.defer();defer.reject(val);return defer.promise()});this._promise._resolve(reason)}else{this._promise._reject(reason)}},notify:function(value){this._promise.isResolved()||this._promise._notify(value)}};var PROMISE_STATUS={PENDING:0,RESOLVED:1,FULFILLED:2,REJECTED:3};var Promise=function(resolver){this._value=undef;this._status=PROMISE_STATUS.PENDING;this._fulfilledCallbacks=[];this._rejectedCallbacks=[];this._progressCallbacks=[];if(resolver){var _this=this,resolverFnLen=resolver.length;resolver(function(val){_this.isResolved()||_this._resolve(val)},resolverFnLen>1?function(reason){_this.isResolved()||_this._reject(reason)}:undef,resolverFnLen>2?function(val){_this.isResolved()||_this._notify(val)}:undef)}};Promise.prototype={valueOf:function(){return this._value},isResolved:function(){return this._status!==PROMISE_STATUS.PENDING},isFulfilled:function(){return this._status===PROMISE_STATUS.FULFILLED},isRejected:function(){return this._status===PROMISE_STATUS.REJECTED},then:function(onFulfilled,onRejected,onProgress,ctx){var defer=new Deferred;this._addCallbacks(defer,onFulfilled,onRejected,onProgress,ctx);return defer.promise()},"catch":function(onRejected,ctx){return this.then(undef,onRejected,ctx)},fail:function(onRejected,ctx){return this.then(undef,onRejected,ctx)},always:function(onResolved,ctx){var _this=this,cb=function(){return onResolved.call(this,_this)};return this.then(cb,cb,ctx)},progress:function(onProgress,ctx){return this.then(undef,undef,onProgress,ctx)},spread:function(onFulfilled,onRejected,ctx){return this.then(function(val){return onFulfilled.apply(this,val)},onRejected,ctx)},done:function(onFulfilled,onRejected,onProgress,ctx){this.then(onFulfilled,onRejected,onProgress,ctx).fail(throwException)},delay:function(delay){var timer,promise=this.then(function(val){var defer=new Deferred;timer=setTimeout(function(){defer.resolve(val)},delay);return defer.promise()});promise.always(function(){clearTimeout(timer)});return promise},timeout:function(timeout){var defer=new Deferred,timer=setTimeout(function(){defer.reject(new vow.TimedOutError("timed out"))},timeout);this.then(function(val){defer.resolve(val)},function(reason){defer.reject(reason)});defer.promise().always(function(){clearTimeout(timer)});return defer.promise()},_vow:true,_resolve:function(val){if(this._status>PROMISE_STATUS.RESOLVED){return}if(val===this){this._reject(TypeError("Can't resolve promise with itself"));return}this._status=PROMISE_STATUS.RESOLVED;if(val&&!!val._vow){val.isFulfilled()?this._fulfill(val.valueOf()):val.isRejected()?this._reject(val.valueOf()):val.then(this._fulfill,this._reject,this._notify,this);return}if(isObject(val)||isFunction(val)){var then;try{then=val.then}catch(e){this._reject(e);return}if(isFunction(then)){var _this=this,isResolved=false;try{then.call(val,function(val){if(isResolved){return}isResolved=true;_this._resolve(val)},function(err){if(isResolved){return}isResolved=true;_this._reject(err)},function(val){_this._notify(val)})}catch(e){isResolved||this._reject(e)}return}}this._fulfill(val)},_fulfill:function(val){if(this._status>PROMISE_STATUS.RESOLVED){return}this._status=PROMISE_STATUS.FULFILLED;this._value=val;this._callCallbacks(this._fulfilledCallbacks,val);this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=undef},_reject:function(reason){if(this._status>PROMISE_STATUS.RESOLVED){return}this._status=PROMISE_STATUS.REJECTED;this._value=reason;this._callCallbacks(this._rejectedCallbacks,reason);this._fulfilledCallbacks=this._rejectedCallbacks=this._progressCallbacks=undef},_notify:function(val){this._callCallbacks(this._progressCallbacks,val)},_addCallbacks:function(defer,onFulfilled,onRejected,onProgress,ctx){if(onRejected&&!isFunction(onRejected)){ctx=onRejected;onRejected=undef}else if(onProgress&&!isFunction(onProgress)){ctx=onProgress;onProgress=undef}var cb;if(!this.isRejected()){cb={defer:defer,fn:isFunction(onFulfilled)?onFulfilled:undef,ctx:ctx};this.isFulfilled()?this._callCallbacks([cb],this._value):this._fulfilledCallbacks.push(cb)}if(!this.isFulfilled()){cb={defer:defer,fn:onRejected,ctx:ctx};this.isRejected()?this._callCallbacks([cb],this._value):this._rejectedCallbacks.push(cb)}if(this._status<=PROMISE_STATUS.RESOLVED){this._progressCallbacks.push({defer:defer,fn:onProgress,ctx:ctx})}},_callCallbacks:function(callbacks,arg){var len=callbacks.length;if(!len){return}var isResolved=this.isResolved(),isFulfilled=this.isFulfilled();nextTick(function(){var i=0,cb,defer,fn;while(i<len){cb=callbacks[i++];defer=cb.defer;fn=cb.fn;if(fn){var ctx=cb.ctx,res;try{res=ctx?fn.call(ctx,arg):fn(arg)}catch(e){defer.reject(e);continue}isResolved?defer.resolve(res):defer.notify(res)}else{isResolved?isFulfilled?defer.resolve(arg):defer.reject(arg):defer.notify(arg)}}})}};var staticMethods={cast:function(value){return vow.cast(value)},all:function(iterable){return vow.all(iterable)},race:function(iterable){return vow.anyResolved(iterable)},resolve:function(value){return vow.resolve(value)},reject:function(reason){return vow.reject(reason)}};for(var prop in staticMethods){staticMethods.hasOwnProperty(prop)&&(Promise[prop]=staticMethods[prop])}var vow={Deferred:Deferred,Promise:Promise,defer:function(){return new Deferred},when:function(value,onFulfilled,onRejected,onProgress,ctx){return vow.cast(value).then(onFulfilled,onRejected,onProgress,ctx)},fail:function(value,onRejected,ctx){return vow.when(value,undef,onRejected,ctx)},always:function(value,onResolved,ctx){return vow.when(value).always(onResolved,ctx)},progress:function(value,onProgress,ctx){return vow.when(value).progress(onProgress,ctx)},spread:function(value,onFulfilled,onRejected,ctx){return vow.when(value).spread(onFulfilled,onRejected,ctx)},done:function(value,onFulfilled,onRejected,onProgress,ctx){vow.when(value).done(onFulfilled,onRejected,onProgress,ctx)},isPromise:function(value){return isObject(value)&&isFunction(value.then)},cast:function(value){return vow.isPromise(value)?value:vow.resolve(value)},valueOf:function(value){return value&&isFunction(value.valueOf)?value.valueOf():value},isFulfilled:function(value){return value&&isFunction(value.isFulfilled)?value.isFulfilled():true},isRejected:function(value){return value&&isFunction(value.isRejected)?value.isRejected():false},isResolved:function(value){return value&&isFunction(value.isResolved)?value.isResolved():true},resolve:function(value){var res=vow.defer();res.resolve(value);return res.promise()},fulfill:function(value){var defer=vow.defer(),promise=defer.promise();defer.resolve(value);return promise.isFulfilled()?promise:promise.then(null,function(reason){return reason})},reject:function(reason){var defer=vow.defer();defer.reject(reason);return defer.promise()},invoke:function(fn,args){var len=Math.max(arguments.length-1,0),callArgs;if(len){callArgs=Array(len);var i=0;while(i<len){callArgs[i++]=arguments[i]}}try{return vow.resolve(callArgs?fn.apply(global,callArgs):fn.call(global))}catch(e){return vow.reject(e)}},all:function(iterable){var defer=new Deferred,isPromisesArray=isArray(iterable),keys=isPromisesArray?getArrayKeys(iterable):getObjectKeys(iterable),len=keys.length,res=isPromisesArray?[]:{};if(!len){defer.resolve(res);return defer.promise()}var i=len;vow._forEach(iterable,function(value,idx){res[keys[idx]]=value;if(!--i){defer.resolve(res)}},defer.reject,defer.notify,defer,keys);return defer.promise()},allResolved:function(iterable){var defer=new Deferred,isPromisesArray=isArray(iterable),keys=isPromisesArray?getArrayKeys(iterable):getObjectKeys(iterable),i=keys.length,res=isPromisesArray?[]:{};if(!i){defer.resolve(res);return defer.promise()}var onResolved=function(){--i||defer.resolve(iterable)};vow._forEach(iterable,onResolved,onResolved,defer.notify,defer,keys);return defer.promise()},allPatiently:function(iterable){return vow.allResolved(iterable).then(function(){var isPromisesArray=isArray(iterable),keys=isPromisesArray?getArrayKeys(iterable):getObjectKeys(iterable),rejectedPromises,fulfilledPromises,len=keys.length,i=0,key,promise;if(!len){return isPromisesArray?[]:{}}while(i<len){key=keys[i++];promise=iterable[key];if(vow.isRejected(promise)){rejectedPromises||(rejectedPromises=isPromisesArray?[]:{});isPromisesArray?rejectedPromises.push(promise.valueOf()):rejectedPromises[key]=promise.valueOf()}else if(!rejectedPromises){(fulfilledPromises||(fulfilledPromises=isPromisesArray?[]:{}))[key]=vow.valueOf(promise)}}if(rejectedPromises){throw rejectedPromises}return fulfilledPromises})},any:function(iterable){var defer=new Deferred,len=iterable.length;if(!len){defer.reject(Error());return defer.promise()}var i=0,reason;vow._forEach(iterable,defer.resolve,function(e){i||(reason=e);++i===len&&defer.reject(reason)},defer.notify,defer);return defer.promise()},anyResolved:function(iterable){var defer=new Deferred,len=iterable.length;if(!len){defer.reject(Error());return defer.promise()}vow._forEach(iterable,defer.resolve,defer.reject,defer.notify,defer);return defer.promise()},delay:function(value,delay){return vow.resolve(value).delay(delay)},timeout:function(value,timeout){return vow.resolve(value).timeout(timeout)},_forEach:function(promises,onFulfilled,onRejected,onProgress,ctx,keys){var len=keys?keys.length:promises.length,i=0;while(i<len){vow.when(promises[keys?keys[i]:i],wrapOnFulfilled(onFulfilled,i),onRejected,onProgress,ctx);++i}},TimedOutError:defineCustomErrorType("TimedOut")};var defineAsGlobal=true;if(typeof module==="object"&&typeof module.exports==="object"){module.exports=vow;defineAsGlobal=false}if(typeof modules==="object"&&isFunction(modules.define)){modules.define("vow",function(provide){provide(vow)});defineAsGlobal=false}if(typeof define==="function"){define(function(require,exports,module){module.exports=vow});defineAsGlobal=false}defineAsGlobal&&(global.vow=vow)})(this);(function(global){function ApiError(type,message){this.name="ApiError";this.type=type;this.message=message;if(Error.captureStackTrace){Error.captureStackTrace(this,this.constructor)}}ApiError.prototype=Object.create(Error.prototype,{constructor:{value:ApiError}});ApiError.BAD_REQUEST="BAD_REQUEST";ApiError.INTERNAL_ERROR="INTERNAL_ERROR";ApiError.NOT_FOUND="NOT_FOUND";var defineAsGlobal=true;if(typeof global.modules==="object"){global.modules.define("bla-error",function(provide){provide(ApiError)});defineAsGlobal=false}if(typeof global.define==="function"){global.define("bla-error",function(){return ApiError});defineAsGlobal=false}if(typeof require==="function"&&typeof module==="object"&&typeof module.exports==="object"){module.exports=ApiError;defineAsGlobal=false}if(defineAsGlobal){global.bla=global.bla||{};global.bla.ApiError=ApiError}})(window);(function(global){function createApiClass(vow,ApiError){function sendAjaxRequest(url,data){var xhr=new XMLHttpRequest;var d=vow.defer();xhr.onreadystatechange=function(){if(xhr.readyState===XMLHttpRequest.DONE){if(xhr.status===200){d.resolve(JSON.parse(xhr.responseText))}else{d.reject(xhr)}}};xhr.open("POST",url,true);xhr.setRequestHeader("Accept","application/json, text/javascript, */*; q=0.01");xhr.setRequestHeader("Content-type","application/json");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.send(data);return d.promise()}var XHR_ERRORS={404:new ApiError(ApiError.NOT_FOUND,"API middleware wasn't found")};function Api(basePath,options){this._basePath=basePath;options=options||{};this._options={enableBatching:options.hasOwnProperty("enableBatching")?options.enableBatching:true};this._batch=[];this._deferreds={}}Api.prototype={constructor:Api,exec:function(methodName,params,execOptions){execOptions=execOptions||{};var enableBatching=execOptions.hasOwnProperty("enableBatching")?execOptions.enableBatching:this._options.enableBatching;return enableBatching?this._execWithBatching(methodName,params):this._execWithoutBatching(methodName,params)},_execWithoutBatching:function(methodName,params){var defer=vow.defer();var url=this._basePath+methodName;var data=JSON.stringify(params);sendAjaxRequest(url,data).then(this._resolvePromise.bind(this,defer),this._rejectPromise.bind(this,defer));return defer.promise()},_execWithBatching:function(methodName,params){var requestId=this._getRequestId(methodName,params);var promise=this._getRequestPromise(requestId);if(!promise){this._addToBatch(methodName,params);promise=this._createPromise(requestId);this._run()}return promise},_getRequestId:function(methodName,params){var stringifiedParams=JSON.stringify(params)||"";return methodName+stringifiedParams},_getRequestPromise:function(requestId){var defer=this._deferreds[requestId];return defer&&defer.promise()},_addToBatch:function(methodName,params){this._batch.push({method:methodName,params:params})},_createPromise:function(requestId){var defer=vow.defer();this._deferreds[requestId]=defer;return defer.promise()},_run:function(){if(this._batch.length===1){vow.resolve().then(this._sendBatchRequest,this)}},_sendBatchRequest:function(){var url=this._basePath+"batch";var data=JSON.stringify({methods:this._batch});sendAjaxRequest(url,data).then(this._resolvePromises.bind(this,this._batch),this._rejectPromises.bind(this,this._batch));this._batch=[]},_resolvePromise:function(defer,response){var error=response.error;if(error){defer.reject(new ApiError(error.type,error.message))}else{defer.resolve(response.data)}},_resolvePromises:function(batch,response){var data=response.data;for(var i=0,requestId;i<batch.length;i++){requestId=this._getRequestId(batch[i].method,batch[i].params);this._resolvePromise(this._deferreds[requestId],data[i]);delete this._deferreds[requestId]}},_rejectPromise:function(defer,xhr){var errorMessage=xhr.message||xhr.statusText||xhr.responseText;var error=XHR_ERRORS[xhr.status]||new ApiError(ApiError.INTERNAL_ERROR,errorMessage);defer.reject(error)},_rejectPromises:function(batch,xhr){for(var i=0,requestId;i<batch.length;i++){requestId=this._getRequestId(batch[i].method,batch[i].params);this._rejectPromise(this._deferreds[requestId],xhr);delete this._deferreds[requestId]}}};return Api}var defineAsGlobal=true;if(typeof global.modules==="object"){global.modules.define("bla",["vow","bla-error"],function(provide,vow,ApiError){var Api=createApiClass(vow,ApiError);provide(Api)});defineAsGlobal=false}if(typeof global.define==="function"){global.define("bla",["bla-error","vow"],function(ApiError,vow){return createApiClass(vow,ApiError)});defineAsGlobal=false}if(typeof require==="function"&&typeof module==="object"&&typeof module.exports==="object"){var vow=require("vow");var ApiError=require("../bla-error/bla-error.js");module.exports=createApiClass(vow,ApiError);defineAsGlobal=false}if(defineAsGlobal){global.bla=global.bla||{};global.bla.Api=createApiClass(global.vow,global.bla.ApiError)}})(window);
Beispiel #4
0
 it('Should return promise', function () {
     assert.ok(vow.isPromise(vowGlob()));
 });
 it('generated function should return promise on call', function () {
     var result = Tools.promisify({}, function () {})();
     assert(Vow.isPromise(result));
 });