0
|
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 }); |