PageRenderTime 22ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/ajax/libs/rxjs/2.2.21/rx.async.js

https://gitlab.com/Mirros/cdnjs
JavaScript | 328 lines | 219 code | 32 blank | 77 comment | 45 complexity | ad1c73ec60ee34a76a1e59c7932137eb MD5 | raw file
  1. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
  2. ;(function (factory) {
  3. var objectTypes = {
  4. 'boolean': false,
  5. 'function': true,
  6. 'object': true,
  7. 'number': false,
  8. 'string': false,
  9. 'undefined': false
  10. };
  11. var root = (objectTypes[typeof window] && window) || this,
  12. freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,
  13. freeModule = objectTypes[typeof module] && module && !module.nodeType && module,
  14. moduleExports = freeModule && freeModule.exports === freeExports && freeExports,
  15. freeGlobal = objectTypes[typeof global] && global;
  16. if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
  17. root = freeGlobal;
  18. }
  19. // Because of build optimizers
  20. if (typeof define === 'function' && define.amd) {
  21. define(['rx.binding', 'exports'], function (Rx, exports) {
  22. root.Rx = factory(root, exports, Rx);
  23. return root.Rx;
  24. });
  25. } else if (typeof module === 'object' && module && module.exports === freeExports) {
  26. module.exports = factory(root, module.exports, require('./rx'));
  27. } else {
  28. root.Rx = factory(root, {}, root.Rx);
  29. }
  30. }.call(this, function (root, exp, Rx, undefined) {
  31. // Aliases
  32. var Observable = Rx.Observable,
  33. observableProto = Observable.prototype,
  34. observableFromPromise = Observable.fromPromise,
  35. observableThrow = Observable.throwException,
  36. AnonymousObservable = Rx.AnonymousObservable,
  37. AsyncSubject = Rx.AsyncSubject,
  38. disposableCreate = Rx.Disposable.create,
  39. CompositeDisposable= Rx.CompositeDisposable,
  40. immediateScheduler = Rx.Scheduler.immediate,
  41. timeoutScheduler = Rx.Scheduler.timeout,
  42. slice = Array.prototype.slice;
  43. /**
  44. * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.
  45. *
  46. * @example
  47. * var res = Rx.Observable.start(function () { console.log('hello'); });
  48. * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);
  49. * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);
  50. *
  51. * @param {Function} func Function to run asynchronously.
  52. * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.
  53. * @param [context] The context for the func parameter to be executed. If not specified, defaults to undefined.
  54. * @returns {Observable} An observable sequence exposing the function's result value, or an exception.
  55. *
  56. * Remarks
  57. * * The function is called immediately, not during the subscription of the resulting sequence.
  58. * * Multiple subscriptions to the resulting sequence can observe the function's result.
  59. */
  60. Observable.start = function (func, scheduler, context) {
  61. return observableToAsync(func, scheduler, context)();
  62. };
  63. /**
  64. * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.
  65. *
  66. * @example
  67. * var res = Rx.Observable.toAsync(function (x, y) { return x + y; })(4, 3);
  68. * var res = Rx.Observable.toAsync(function (x, y) { return x + y; }, Rx.Scheduler.timeout)(4, 3);
  69. * var res = Rx.Observable.toAsync(function (x) { this.log(x); }, Rx.Scheduler.timeout, console)('hello');
  70. *
  71. * @param {Function} function Function to convert to an asynchronous function.
  72. * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.
  73. * @param {Mixed} [context] The context for the func parameter to be executed. If not specified, defaults to undefined.
  74. * @returns {Function} Asynchronous function.
  75. */
  76. var observableToAsync = Observable.toAsync = function (func, scheduler, context) {
  77. scheduler || (scheduler = timeoutScheduler);
  78. return function () {
  79. var args = arguments,
  80. subject = new AsyncSubject();
  81. scheduler.schedule(function () {
  82. var result;
  83. try {
  84. result = func.apply(context, args);
  85. } catch (e) {
  86. subject.onError(e);
  87. return;
  88. }
  89. subject.onNext(result);
  90. subject.onCompleted();
  91. });
  92. return subject.asObservable();
  93. };
  94. };
  95. /**
  96. * Converts a callback function to an observable sequence.
  97. *
  98. * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.
  99. * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.
  100. * @param {Mixed} [context] The context for the func parameter to be executed. If not specified, defaults to undefined.
  101. * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.
  102. * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.
  103. */
  104. Observable.fromCallback = function (func, scheduler, context, selector) {
  105. scheduler || (scheduler = immediateScheduler);
  106. return function () {
  107. var args = slice.call(arguments, 0);
  108. return new AnonymousObservable(function (observer) {
  109. return scheduler.schedule(function () {
  110. function handler(e) {
  111. var results = e;
  112. if (selector) {
  113. try {
  114. results = selector(arguments);
  115. } catch (err) {
  116. observer.onError(err);
  117. return;
  118. }
  119. } else {
  120. if (results.length === 1) {
  121. results = results[0];
  122. }
  123. }
  124. observer.onNext(results);
  125. observer.onCompleted();
  126. }
  127. args.push(handler);
  128. func.apply(context, args);
  129. });
  130. });
  131. };
  132. };
  133. /**
  134. * Converts a Node.js callback style function to an observable sequence. This must be in function (err, ...) format.
  135. * @param {Function} func The function to call
  136. * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.
  137. * @param {Mixed} [context] The context for the func parameter to be executed. If not specified, defaults to undefined.
  138. * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.
  139. * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.
  140. */
  141. Observable.fromNodeCallback = function (func, scheduler, context, selector) {
  142. scheduler || (scheduler = immediateScheduler);
  143. return function () {
  144. var args = slice.call(arguments, 0);
  145. return new AnonymousObservable(function (observer) {
  146. return scheduler.schedule(function () {
  147. function handler(err) {
  148. if (err) {
  149. observer.onError(err);
  150. return;
  151. }
  152. var results = slice.call(arguments, 1);
  153. if (selector) {
  154. try {
  155. results = selector(results);
  156. } catch (e) {
  157. observer.onError(e);
  158. return;
  159. }
  160. } else {
  161. if (results.length === 1) {
  162. results = results[0];
  163. }
  164. }
  165. observer.onNext(results);
  166. observer.onCompleted();
  167. }
  168. args.push(handler);
  169. func.apply(context, args);
  170. });
  171. });
  172. };
  173. };
  174. function createListener (element, name, handler) {
  175. // Node.js specific
  176. if (element.addListener) {
  177. element.addListener(name, handler);
  178. return disposableCreate(function () {
  179. element.removeListener(name, handler);
  180. });
  181. }
  182. if (element.addEventListener) {
  183. element.addEventListener(name, handler, false);
  184. return disposableCreate(function () {
  185. element.removeEventListener(name, handler, false);
  186. });
  187. }
  188. throw new Error('No listener found');
  189. }
  190. function createEventListener (el, eventName, handler) {
  191. var disposables = new CompositeDisposable();
  192. // Asume NodeList
  193. if (typeof el.item === 'function' && typeof el.length === 'number') {
  194. for (var i = 0, len = el.length; i < len; i++) {
  195. disposables.add(createEventListener(el.item(i), eventName, handler));
  196. }
  197. } else if (el) {
  198. disposables.add(createListener(el, eventName, handler));
  199. }
  200. return disposables;
  201. }
  202. // Check for Angular/jQuery/Zepto support
  203. var jq =
  204. !!root.angular && !!angular.element ? angular.element :
  205. (!!root.jQuery ? root.jQuery : (
  206. !!root.Zepto ? root.Zepto : null));
  207. // Check for ember
  208. var ember = !!root.Ember && typeof root.Ember.addListener === 'function';
  209. /**
  210. * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.
  211. *
  212. * @example
  213. * var source = Rx.Observable.fromEvent(element, 'mouseup');
  214. *
  215. * @param {Object} element The DOMElement or NodeList to attach a listener.
  216. * @param {String} eventName The event name to attach the observable sequence.
  217. * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.
  218. * @returns {Observable} An observable sequence of events from the specified element and the specified event.
  219. */
  220. Observable.fromEvent = function (element, eventName, selector) {
  221. if (ember) {
  222. return fromEventPattern(
  223. function (h) { Ember.addListener(element, eventName); },
  224. function (h) { Ember.removeListener(element, eventName); },
  225. selector);
  226. }
  227. if (jq) {
  228. var $elem = jq(element);
  229. return fromEventPattern(
  230. function (h) { $elem.on(eventName, h); },
  231. function (h) { $elem.off(eventName, h); },
  232. selector);
  233. }
  234. return new AnonymousObservable(function (observer) {
  235. return createEventListener(
  236. element,
  237. eventName,
  238. function handler (e) {
  239. var results = e;
  240. if (selector) {
  241. try {
  242. results = selector(arguments);
  243. } catch (err) {
  244. observer.onError(err);
  245. return
  246. }
  247. }
  248. observer.onNext(results);
  249. });
  250. }).publish().refCount();
  251. };
  252. /**
  253. * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.
  254. * @param {Function} addHandler The function to add a handler to the emitter.
  255. * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.
  256. * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.
  257. * @returns {Observable} An observable sequence which wraps an event from an event emitter
  258. */
  259. var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {
  260. return new AnonymousObservable(function (observer) {
  261. function innerHandler (e) {
  262. var result = e;
  263. if (selector) {
  264. try {
  265. result = selector(arguments);
  266. } catch (err) {
  267. observer.onError(err);
  268. return;
  269. }
  270. }
  271. observer.onNext(result);
  272. }
  273. var returnValue = addHandler(innerHandler);
  274. return disposableCreate(function () {
  275. if (removeHandler) {
  276. removeHandler(innerHandler, returnValue);
  277. }
  278. });
  279. }).publish().refCount();
  280. };
  281. /**
  282. * Invokes the asynchronous function, surfacing the result through an observable sequence.
  283. * @param {Function} functionAsync Asynchronous function which returns a Promise to run.
  284. * @returns {Observable} An observable sequence exposing the function's result value, or an exception.
  285. */
  286. Observable.startAsync = function (functionAsync) {
  287. var promise;
  288. try {
  289. promise = functionAsync();
  290. } catch (e) {
  291. return observableThrow(e);
  292. }
  293. return observableFromPromise(promise);
  294. }
  295. return Rx;
  296. }));