Merge pull request #400 from matrix-org/rav/cancel_rate_limited_funcs
Cancel calls to rate-limited funcs on unmountpull/21833/head
						commit
						839b985289
					
				|  | @ -273,6 +273,9 @@ module.exports = React.createClass({ | |||
| 
 | ||||
|         window.removeEventListener('resize', this.onResize); | ||||
| 
 | ||||
|         // cancel any pending calls to the rate_limited_funcs
 | ||||
|         this._updateRoomMembers.cancelPendingCall(); | ||||
| 
 | ||||
|         // no need to do this as Dir & Settings are now overlays. It just burnt CPU.
 | ||||
|         // console.log("Tinter.tint from RoomView.unmount");
 | ||||
|         // Tinter.tint(); // reset colourscheme
 | ||||
|  |  | |||
|  | @ -58,6 +58,8 @@ module.exports = React.createClass({ | |||
|         if (cli) { | ||||
|             cli.removeListener("RoomState.members", this.onRoomStateMember); | ||||
|         } | ||||
|         // cancel any pending calls to the rate_limited_funcs
 | ||||
|         this._updateList.cancelPendingCall(); | ||||
|     }, | ||||
| 
 | ||||
|     _updateList: new rate_limited_func(function() { | ||||
|  | @ -100,7 +102,7 @@ module.exports = React.createClass({ | |||
|             <EntityTile key="dynamic_invite_tile" suppressOnHover={true} showInviteButton={true} | ||||
|                 avatarJsx={ <BaseAvatar name="@" width={36} height={36} /> } | ||||
|                 className="mx_EntityTile_invitePlaceholder" | ||||
|                 presenceState="online" onClick={this.onThirdPartyInvite} name={"Invite by email"}  | ||||
|                 presenceState="online" onClick={this.onThirdPartyInvite} name={"Invite by email"} | ||||
|             />, | ||||
|             function(query) { | ||||
|                 return true; // always show this
 | ||||
|  |  | |||
|  | @ -81,6 +81,9 @@ module.exports = React.createClass({ | |||
|             cli.removeListener("User.lastPresenceTs", this.onUserLastPresenceTs); | ||||
|             // cli.removeListener("Room.timeline", this.onRoomTimeline);
 | ||||
|         } | ||||
| 
 | ||||
|         // cancel any pending calls to the rate_limited_funcs
 | ||||
|         this._updateList.cancelPendingCall(); | ||||
|     }, | ||||
| 
 | ||||
| /* | ||||
|  |  | |||
|  | @ -101,6 +101,8 @@ module.exports = React.createClass({ | |||
|             MatrixClientPeg.get().removeListener("RoomState.events", this.onRoomStateEvents); | ||||
|             MatrixClientPeg.get().removeListener("RoomMember.name", this.onRoomMemberName); | ||||
|         } | ||||
|         // cancel any pending calls to the rate_limited_funcs
 | ||||
|         this._delayedRefreshRoomList.cancelPendingCall(); | ||||
|     }, | ||||
| 
 | ||||
|     onRoom: function(room) { | ||||
|  |  | |||
|  | @ -21,13 +21,16 @@ limitations under the License. | |||
|  * | ||||
|  * Note that the function must not take arguments, since the args | ||||
|  * could be different for each invocarion of the function. | ||||
|  * | ||||
|  * The returned function has a 'cancelPendingCall' property which can be called | ||||
|  * on unmount or similar to cancel any pending update. | ||||
|  */ | ||||
| module.exports = function(f, minIntervalMs) { | ||||
|     this.lastCall = 0; | ||||
|     this.scheduledCall = undefined; | ||||
| 
 | ||||
|     var self = this; | ||||
|     return function() { | ||||
|     var wrapper = function() { | ||||
|         var now = Date.now(); | ||||
| 
 | ||||
|         if (self.lastCall < now - minIntervalMs) { | ||||
|  | @ -44,5 +47,23 @@ module.exports = function(f, minIntervalMs) { | |||
|             ); | ||||
|         } | ||||
|     }; | ||||
| }; | ||||
| 
 | ||||
|     // add the cancelPendingCall property
 | ||||
|     wrapper.cancelPendingCall = function() { | ||||
|         if (self.scheduledCall) { | ||||
|             clearTimeout(self.scheduledCall); | ||||
|             self.scheduledCall = undefined; | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     // make sure that cancelPendingCall is copied when react rebinds the
 | ||||
|     // wrapper
 | ||||
|     var _bind = wrapper.bind; | ||||
|     wrapper.bind = function() { | ||||
|         var rebound = _bind.apply(this, arguments); | ||||
|         rebound.cancelPendingCall = wrapper.cancelPendingCall; | ||||
|         return rebound; | ||||
|     }; | ||||
| 
 | ||||
|     return wrapper; | ||||
| }; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 David Baker
						David Baker