Blame view

node_modules/when/lib/env.js 2.12 KB
ce4c83ff   wxy   初始提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  /** @license MIT License (c) copyright 2010-2014 original author or authors */
  /** @author Brian Cavalier */
  /** @author John Hann */
  
  /*global process,document,setTimeout,clearTimeout,MutationObserver,WebKitMutationObserver*/
  (function(define) { 'use strict';
  define(function(require) {
  	/*jshint maxcomplexity:6*/
  
  	// Sniff "best" async scheduling option
  	// Prefer process.nextTick or MutationObserver, then check for
  	// setTimeout, and finally vertx, since its the only env that doesn't
  	// have setTimeout
  
  	var MutationObs;
  	var capturedSetTimeout = typeof setTimeout !== 'undefined' && setTimeout;
  
  	// Default env
  	var setTimer = function(f, ms) { return setTimeout(f, ms); };
  	var clearTimer = function(t) { return clearTimeout(t); };
  	var asap = function (f) { return capturedSetTimeout(f, 0); };
  
  	// Detect specific env
  	if (isNode()) { // Node
  		asap = function (f) { return process.nextTick(f); };
  
  	} else if (MutationObs = hasMutationObserver()) { // Modern browser
  		asap = initMutationObserver(MutationObs);
  
  	} else if (!capturedSetTimeout) { // vert.x
  		var vertxRequire = require;
  		var vertx = vertxRequire('vertx');
  		setTimer = function (f, ms) { return vertx.setTimer(ms, f); };
  		clearTimer = vertx.cancelTimer;
  		asap = vertx.runOnLoop || vertx.runOnContext;
  	}
  
  	return {
  		setTimer: setTimer,
  		clearTimer: clearTimer,
  		asap: asap
  	};
  
  	function isNode () {
  		return typeof process !== 'undefined' && process !== null &&
  			typeof process.nextTick === 'function';
  	}
  
  	function hasMutationObserver () {
  		return (typeof MutationObserver === 'function' && MutationObserver) ||
  			(typeof WebKitMutationObserver === 'function' && WebKitMutationObserver);
  	}
  
  	function initMutationObserver(MutationObserver) {
  		var scheduled;
  		var node = document.createTextNode('');
  		var o = new MutationObserver(run);
  		o.observe(node, { characterData: true });
  
  		function run() {
  			var f = scheduled;
  			scheduled = void 0;
  			f();
  		}
  
  		var i = 0;
  		return function (f) {
  			scheduled = f;
  			node.data = (i ^= 1);
  		};
  	}
  });
  }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));