You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.2 KiB
55 lines
1.2 KiB
/** @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(); })); |
|
|
|
|
|
|