Mercurial > pub > ImplabJs
diff src/implab/guard.js @ 0:fc2517695ee1
Initial commit, draft import of existing work
author | cin |
---|---|
date | Thu, 01 Jun 2017 13:20:03 +0300 |
parents | |
children | 00779cb63b12 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/implab/guard.js Thu Jun 01 13:20:03 2017 +0300 @@ -0,0 +1,54 @@ +define([ "dojo/Deferred" ], function(Deferred) { + var toPromise = function(d) { + if (d && d.then) + return d; + var d2 = new Deferred(); + d2.resolve(d); + return d2; + }; + + /** + * функция для асинхронного выполнения метода + * + * @async + * @param{Object} o Объект, который будет использован в качестве + * <code>this</code>, если не указан, будет + * <code>null</code> + * @param{Function|String} m Функция или имя метода, обязательный параметр. + * Если указано имя, тогда параметр <code>o</code> + * также должен быть задан + * @param{Array} args Параметры для вызова метода, не обязательно. + * @returns{dojo/promise} + */ + return function(o, m, args) { + if (arguments.length == 1) { + m = o; + o = null; + } else if (arguments.length == 2 && o instanceof Function && + m instanceof Array) { + args = m; + m = o; + o = null; + } + + try { + if (!(m instanceof Function)) { + if (o) + m = o[m]; + else if (arguments.length == 1) + return toPromise(m); + else + throw new Error("The target object must be specified"); + } + + if (!m) + throw new Error("Method not found"); + + return toPromise(m.apply(o, args)); + } catch (err) { + var d = new Deferred(); + d.reject(err); + return d; + } + }; +}); \ No newline at end of file