1 |
|
2 |
|
3 |
|
4 |
|
5 | (function(define) { 'use strict';
|
6 | define(function() {
|
7 |
|
8 | makeApply.tryCatchResolve = tryCatchResolve;
|
9 |
|
10 | return makeApply;
|
11 |
|
12 | function makeApply(Promise, call) {
|
13 | if(arguments.length < 2) {
|
14 | call = tryCatchResolve;
|
15 | }
|
16 |
|
17 | return apply;
|
18 |
|
19 | function apply(f, thisArg, args) {
|
20 | var p = Promise._defer();
|
21 | var l = args.length;
|
22 | var params = new Array(l);
|
23 | callAndResolve({ f:f, thisArg:thisArg, args:args, params:params, i:l-1, call:call }, p._handler);
|
24 |
|
25 | return p;
|
26 | }
|
27 |
|
28 | function callAndResolve(c, h) {
|
29 | if(c.i < 0) {
|
30 | return call(c.f, c.thisArg, c.params, h);
|
31 | }
|
32 |
|
33 | var handler = Promise._handler(c.args[c.i]);
|
34 | handler.fold(callAndResolveNext, c, void 0, h);
|
35 | }
|
36 |
|
37 | function callAndResolveNext(c, x, h) {
|
38 | c.params[c.i] = x;
|
39 | c.i -= 1;
|
40 | callAndResolve(c, h);
|
41 | }
|
42 | }
|
43 |
|
44 | function tryCatchResolve(f, thisArg, args, resolver) {
|
45 | try {
|
46 | resolver.resolve(f.apply(thisArg, args));
|
47 | } catch(e) {
|
48 | resolver.reject(e);
|
49 | }
|
50 | }
|
51 |
|
52 | });
|
53 | }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
|
54 |
|
55 |
|