56 lines
1.2 KiB
JavaScript
56 lines
1.2 KiB
JavaScript
|
/** @license MIT License (c) copyright 2010-2014 original author or authors */
|
||
|
/** @author Brian Cavalier */
|
||
|
/** @author John Hann */
|
||
|
|
||
|
(function(define) { 'use strict';
|
||
|
define(function() {
|
||
|
|
||
|
makeApply.tryCatchResolve = tryCatchResolve;
|
||
|
|
||
|
return makeApply;
|
||
|
|
||
|
function makeApply(Promise, call) {
|
||
|
if(arguments.length < 2) {
|
||
|
call = tryCatchResolve;
|
||
|
}
|
||
|
|
||
|
return apply;
|
||
|
|
||
|
function apply(f, thisArg, args) {
|
||
|
var p = Promise._defer();
|
||
|
var l = args.length;
|
||
|
var params = new Array(l);
|
||
|
callAndResolve({ f:f, thisArg:thisArg, args:args, params:params, i:l-1, call:call }, p._handler);
|
||
|
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
function callAndResolve(c, h) {
|
||
|
if(c.i < 0) {
|
||
|
return call(c.f, c.thisArg, c.params, h);
|
||
|
}
|
||
|
|
||
|
var handler = Promise._handler(c.args[c.i]);
|
||
|
handler.fold(callAndResolveNext, c, void 0, h);
|
||
|
}
|
||
|
|
||
|
function callAndResolveNext(c, x, h) {
|
||
|
c.params[c.i] = x;
|
||
|
c.i -= 1;
|
||
|
callAndResolve(c, h);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function tryCatchResolve(f, thisArg, args, resolver) {
|
||
|
try {
|
||
|
resolver.resolve(f.apply(thisArg, args));
|
||
|
} catch(e) {
|
||
|
resolver.reject(e);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
});
|
||
|
}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
|
||
|
|
||
|
|