Blame view

node_modules/when/lib/Scheduler.js 1.76 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
74
75
76
77
78
79
80
  /** @license MIT License (c) copyright 2010-2014 original author or authors */
  /** @author Brian Cavalier */
  /** @author John Hann */
  
  (function(define) { 'use strict';
  define(function() {
  
  	// Credit to Twisol (https://github.com/Twisol) for suggesting
  	// this type of extensible queue + trampoline approach for next-tick conflation.
  
  	/**
  	 * Async task scheduler
  	 * @param {function} async function to schedule a single async function
  	 * @constructor
  	 */
  	function Scheduler(async) {
  		this._async = async;
  		this._running = false;
  
  		this._queue = new Array(1<<16);
  		this._queueLen = 0;
  		this._afterQueue = new Array(1<<4);
  		this._afterQueueLen = 0;
  
  		var self = this;
  		this.drain = function() {
  			self._drain();
  		};
  	}
  
  	/**
  	 * Enqueue a task
  	 * @param {{ run:function }} task
  	 */
  	Scheduler.prototype.enqueue = function(task) {
  		this._queue[this._queueLen++] = task;
  		this.run();
  	};
  
  	/**
  	 * Enqueue a task to run after the main task queue
  	 * @param {{ run:function }} task
  	 */
  	Scheduler.prototype.afterQueue = function(task) {
  		this._afterQueue[this._afterQueueLen++] = task;
  		this.run();
  	};
  
  	Scheduler.prototype.run = function() {
  		if (!this._running) {
  			this._running = true;
  			this._async(this.drain);
  		}
  	};
  
  	/**
  	 * Drain the handler queue entirely, and then the after queue
  	 */
  	Scheduler.prototype._drain = function() {
  		var i = 0;
  		for (; i < this._queueLen; ++i) {
  			this._queue[i].run();
  			this._queue[i] = void 0;
  		}
  
  		this._queueLen = 0;
  		this._running = false;
  
  		for (i = 0; i < this._afterQueueLen; ++i) {
  			this._afterQueue[i].run();
  			this._afterQueue[i] = void 0;
  		}
  
  		this._afterQueueLen = 0;
  	};
  
  	return Scheduler;
  
  });
  }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));