PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/ajax/libs/co/3.0.1/index.js

https://gitlab.com/alidz1982/cdnjs
JavaScript | 313 lines | 166 code | 54 blank | 93 comment | 47 complexity | db1261f9e6c2a6d1286dd7ae2179468a MD5 | raw file
  1. !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.co=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
  2. /**
  3. * toString() reference.
  4. */
  5. var toString = Object.prototype.toString;
  6. /**
  7. * slice() reference.
  8. */
  9. var slice = Array.prototype.slice;
  10. /**
  11. * Expose `co`.
  12. */
  13. module.exports = co;
  14. /**
  15. * Wrap the given generator `fn` and
  16. * return a thunk.
  17. *
  18. * @param {Function} fn
  19. * @return {Function}
  20. * @api public
  21. */
  22. function co(fn) {
  23. var isGenFun = isGeneratorFunction(fn);
  24. return function (done) {
  25. var ctx = this;
  26. // in toThink() below we invoke co()
  27. // with a generator, so optimize for
  28. // this case
  29. var gen = fn;
  30. done = done || error;
  31. if (isGenFun) {
  32. // we only need to parse the arguments
  33. // if gen is a generator function.
  34. var args = slice.call(arguments);
  35. // no callback provided
  36. if (!args.length) done = error;
  37. // callback is the last argument
  38. else if ('function' == typeof args[args.length - 1]) done = args.pop();
  39. // arguments provided, but no callbacks
  40. else done = error;
  41. gen = fn.apply(this, args);
  42. }
  43. next();
  44. function next(err, res) {
  45. var ret;
  46. // multiple args
  47. if (arguments.length > 2) res = slice.call(arguments, 1);
  48. // error
  49. if (err) {
  50. try {
  51. ret = gen.throw(err);
  52. } catch (e) {
  53. return done(e);
  54. }
  55. }
  56. // ok
  57. if (!err) {
  58. try {
  59. ret = gen.next(res);
  60. } catch (e) {
  61. return done(e);
  62. }
  63. }
  64. // done
  65. if (ret.done) return done(null, ret.value);
  66. // normalize
  67. ret.value = toThunk(ret.value, ctx);
  68. // run
  69. if ('function' == typeof ret.value) {
  70. var called = false;
  71. try {
  72. ret.value.call(ctx, function(){
  73. if (called) return;
  74. called = true;
  75. next.apply(ctx, arguments);
  76. });
  77. } catch (e) {
  78. setImmediate(function(){
  79. if (called) return;
  80. called = true;
  81. next(e);
  82. });
  83. }
  84. return;
  85. }
  86. // invalid
  87. next(new Error('yield a function, promise, generator, array, or object'));
  88. }
  89. }
  90. }
  91. /**
  92. * Convert `obj` into a normalized thunk.
  93. *
  94. * @param {Mixed} obj
  95. * @param {Mixed} ctx
  96. * @return {Function}
  97. * @api private
  98. */
  99. function toThunk(obj, ctx) {
  100. var fn = obj;
  101. if (Array.isArray(obj)) fn = arrayToThunk.call(ctx, obj);
  102. if ('[object Object]' == toString.call(obj)) fn = objectToThunk.call(ctx, obj);
  103. if (isGeneratorFunction(obj)) obj = obj.call(ctx);
  104. if (isGenerator(obj)) fn = co(obj);
  105. if (isPromise(obj)) fn = promiseToThunk(obj);
  106. return fn;
  107. }
  108. /**
  109. * Convert an array of yieldables to a thunk.
  110. *
  111. * @param {Array}
  112. * @return {Function}
  113. * @api private
  114. */
  115. function arrayToThunk(fns) {
  116. var ctx = this;
  117. return function(done){
  118. var pending = fns.length;
  119. var results = new Array(pending);
  120. var finished;
  121. if (!pending) {
  122. setImmediate(function(){
  123. done(null, results);
  124. });
  125. return;
  126. }
  127. for (var i = 0; i < fns.length; i++) {
  128. run(fns[i], i);
  129. }
  130. function run(fn, i) {
  131. if (finished) return;
  132. try {
  133. fn = toThunk(fn, ctx);
  134. fn.call(ctx, function(err, res){
  135. if (finished) return;
  136. if (err) {
  137. finished = true;
  138. return done(err);
  139. }
  140. results[i] = res;
  141. --pending || done(null, results);
  142. });
  143. } catch (err) {
  144. finished = true;
  145. done(err);
  146. }
  147. }
  148. }
  149. }
  150. /**
  151. * Convert an object of yieldables to a thunk.
  152. *
  153. * @param {Object} obj
  154. * @return {Function}
  155. * @api private
  156. */
  157. function objectToThunk(obj){
  158. var ctx = this;
  159. return function(done){
  160. var keys = Object.keys(obj);
  161. var pending = keys.length;
  162. var results = {};
  163. var finished;
  164. if (!pending) {
  165. setImmediate(function(){
  166. done(null, results)
  167. });
  168. return;
  169. }
  170. for (var i = 0; i < keys.length; i++) {
  171. run(obj[keys[i]], keys[i]);
  172. }
  173. function run(fn, key) {
  174. if (finished) return;
  175. try {
  176. fn = toThunk(fn, ctx);
  177. if ('function' != typeof fn) {
  178. results[key] = fn;
  179. return --pending || done(null, results);
  180. }
  181. fn.call(ctx, function(err, res){
  182. if (finished) return;
  183. if (err) {
  184. finished = true;
  185. return done(err);
  186. }
  187. results[key] = res;
  188. --pending || done(null, results);
  189. });
  190. } catch (err) {
  191. finished = true;
  192. done(err);
  193. }
  194. }
  195. }
  196. }
  197. /**
  198. * Convert `promise` to a thunk.
  199. *
  200. * @param {Object} promise
  201. * @return {Function}
  202. * @api private
  203. */
  204. function promiseToThunk(promise) {
  205. return function(fn){
  206. promise.then(function(res) {
  207. fn(null, res);
  208. }, fn);
  209. }
  210. }
  211. /**
  212. * Check if `obj` is a promise.
  213. *
  214. * @param {Object} obj
  215. * @return {Boolean}
  216. * @api private
  217. */
  218. function isPromise(obj) {
  219. return obj && 'function' == typeof obj.then;
  220. }
  221. /**
  222. * Check if `obj` is a generator.
  223. *
  224. * @param {Mixed} obj
  225. * @return {Boolean}
  226. * @api private
  227. */
  228. function isGenerator(obj) {
  229. return obj && 'function' == typeof obj.next && 'function' == typeof obj.throw;
  230. }
  231. /**
  232. * Check if `obj` is a generator function.
  233. *
  234. * @param {Mixed} obj
  235. * @return {Boolean}
  236. * @api private
  237. */
  238. function isGeneratorFunction(obj) {
  239. return obj && obj.constructor && 'GeneratorFunction' == obj.constructor.name;
  240. }
  241. /**
  242. * Throw `err` in a new stack.
  243. *
  244. * This is used when co() is invoked
  245. * without supplying a callback, which
  246. * should only be for demonstrational
  247. * purposes.
  248. *
  249. * @param {Error} err
  250. * @api private
  251. */
  252. function error(err) {
  253. if (!err) return;
  254. setImmediate(function(){
  255. throw err;
  256. });
  257. }
  258. },{}]},{},[1])(1)
  259. });