const asyncWrapper=function(instance,data,wrapper) { return function(object) { switch (typeof object) { case 'function': break case 'object': { let keys=Object.keys(object) keys.forEach(key => { let meta={} let func=wrapper.call(instance,key,object[key],meta) func.__meta=meta instance[key]=func }) } break default: } return instance } } export default (instance,data) => asyncWrapper(instance,data,(name,value,meta) => { instance.loading(name,false) return (...params) => { let result=value(instance,...params) let promise=result instanceof Promise prepareMeta(meta) if (promise) { instance.loading(name,meta.key,true) result.then(response => { meta.lastResolvedAt=Date.now() instance.loading(name,meta.key,false) return response }) .catch(response => { meta.lastRejectedAt=Date.now() instance.loading(name,meta.key,false) return response }) return result } return result } }) const prepareMeta=(meta) => { let now=Date.now() meta.key=now+Math.random() meta.lastInvokedAt=now }