apply.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /** @license MIT License (c) copyright 2010-2014 original author or authors */
  2. /** @author Brian Cavalier */
  3. /** @author John Hann */
  4. (function(define) { 'use strict';
  5. define(function() {
  6. makeApply.tryCatchResolve = tryCatchResolve;
  7. return makeApply;
  8. function makeApply(Promise, call) {
  9. if(arguments.length < 2) {
  10. call = tryCatchResolve;
  11. }
  12. return apply;
  13. function apply(f, thisArg, args) {
  14. var p = Promise._defer();
  15. var l = args.length;
  16. var params = new Array(l);
  17. callAndResolve({ f:f, thisArg:thisArg, args:args, params:params, i:l-1, call:call }, p._handler);
  18. return p;
  19. }
  20. function callAndResolve(c, h) {
  21. if(c.i < 0) {
  22. return call(c.f, c.thisArg, c.params, h);
  23. }
  24. var handler = Promise._handler(c.args[c.i]);
  25. handler.fold(callAndResolveNext, c, void 0, h);
  26. }
  27. function callAndResolveNext(c, x, h) {
  28. c.params[c.i] = x;
  29. c.i -= 1;
  30. callAndResolve(c, h);
  31. }
  32. }
  33. function tryCatchResolve(f, thisArg, args, resolver) {
  34. try {
  35. resolver.resolve(f.apply(thisArg, args));
  36. } catch(e) {
  37. resolver.reject(e);
  38. }
  39. }
  40. });
  41. }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));