118 lines
3.1 KiB
JavaScript
118 lines
3.1 KiB
JavaScript
|
/**
|
||
|
* Copyright 2013-present, Facebook, Inc.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* This source code is licensed under the BSD-style license found in the
|
||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||
|
*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
var _prodInvariant = require('./reactProdInvariant');
|
||
|
|
||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
|
||
|
var PooledClass = require('./PooledClass');
|
||
|
|
||
|
var invariant = require('fbjs/lib/invariant');
|
||
|
|
||
|
/**
|
||
|
* A specialized pseudo-event module to help keep track of components waiting to
|
||
|
* be notified when their DOM representations are available for use.
|
||
|
*
|
||
|
* This implements `PooledClass`, so you should never need to instantiate this.
|
||
|
* Instead, use `CallbackQueue.getPooled()`.
|
||
|
*
|
||
|
* @class ReactMountReady
|
||
|
* @implements PooledClass
|
||
|
* @internal
|
||
|
*/
|
||
|
|
||
|
var CallbackQueue = function () {
|
||
|
function CallbackQueue(arg) {
|
||
|
_classCallCheck(this, CallbackQueue);
|
||
|
|
||
|
this._callbacks = null;
|
||
|
this._contexts = null;
|
||
|
this._arg = arg;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Enqueues a callback to be invoked when `notifyAll` is invoked.
|
||
|
*
|
||
|
* @param {function} callback Invoked when `notifyAll` is invoked.
|
||
|
* @param {?object} context Context to call `callback` with.
|
||
|
* @internal
|
||
|
*/
|
||
|
|
||
|
|
||
|
CallbackQueue.prototype.enqueue = function enqueue(callback, context) {
|
||
|
this._callbacks = this._callbacks || [];
|
||
|
this._callbacks.push(callback);
|
||
|
this._contexts = this._contexts || [];
|
||
|
this._contexts.push(context);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Invokes all enqueued callbacks and clears the queue. This is invoked after
|
||
|
* the DOM representation of a component has been created or updated.
|
||
|
*
|
||
|
* @internal
|
||
|
*/
|
||
|
|
||
|
|
||
|
CallbackQueue.prototype.notifyAll = function notifyAll() {
|
||
|
var callbacks = this._callbacks;
|
||
|
var contexts = this._contexts;
|
||
|
var arg = this._arg;
|
||
|
if (callbacks && contexts) {
|
||
|
!(callbacks.length === contexts.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Mismatched list of contexts in callback queue') : _prodInvariant('24') : void 0;
|
||
|
this._callbacks = null;
|
||
|
this._contexts = null;
|
||
|
for (var i = 0; i < callbacks.length; i++) {
|
||
|
callbacks[i].call(contexts[i], arg);
|
||
|
}
|
||
|
callbacks.length = 0;
|
||
|
contexts.length = 0;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
CallbackQueue.prototype.checkpoint = function checkpoint() {
|
||
|
return this._callbacks ? this._callbacks.length : 0;
|
||
|
};
|
||
|
|
||
|
CallbackQueue.prototype.rollback = function rollback(len) {
|
||
|
if (this._callbacks && this._contexts) {
|
||
|
this._callbacks.length = len;
|
||
|
this._contexts.length = len;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Resets the internal queue.
|
||
|
*
|
||
|
* @internal
|
||
|
*/
|
||
|
|
||
|
|
||
|
CallbackQueue.prototype.reset = function reset() {
|
||
|
this._callbacks = null;
|
||
|
this._contexts = null;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* `PooledClass` looks for this.
|
||
|
*/
|
||
|
|
||
|
|
||
|
CallbackQueue.prototype.destructor = function destructor() {
|
||
|
this.reset();
|
||
|
};
|
||
|
|
||
|
return CallbackQueue;
|
||
|
}();
|
||
|
|
||
|
module.exports = PooledClass.addPoolingTo(CallbackQueue);
|