comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:fc2517695ee1
1 define([ "dojo/Deferred" ], function(Deferred) {
2 var toPromise = function(d) {
3 if (d && d.then)
4 return d;
5 var d2 = new Deferred();
6 d2.resolve(d);
7 return d2;
8 };
9
10 /**
11 * функция для асинхронного выполнения метода
12 *
13 * @async
14 * @param{Object} o Объект, который будет использован в качестве
15 * <code>this</code>, если не указан, будет
16 * <code>null</code>
17 * @param{Function|String} m Функция или имя метода, обязательный параметр.
18 * Если указано имя, тогда параметр <code>o</code>
19 * также должен быть задан
20 * @param{Array} args Параметры для вызова метода, не обязательно.
21 * @returns{dojo/promise}
22 */
23 return function(o, m, args) {
24 if (arguments.length == 1) {
25 m = o;
26 o = null;
27 } else if (arguments.length == 2 && o instanceof Function &&
28 m instanceof Array) {
29 args = m;
30 m = o;
31 o = null;
32 }
33
34 try {
35 if (!(m instanceof Function)) {
36 if (o)
37 m = o[m];
38 else if (arguments.length == 1)
39 return toPromise(m);
40 else
41 throw new Error("The target object must be specified");
42 }
43
44 if (!m)
45 throw new Error("Method not found");
46
47 return toPromise(m.apply(o, args));
48 } catch (err) {
49 var d = new Deferred();
50 d.reject(err);
51 return d;
52 }
53 };
54 });