diff --git a/spec/SubscriptionDefinition.spec.js b/spec/SubscriptionDefinition.spec.js index 45916a3..7606a71 100644 --- a/spec/SubscriptionDefinition.spec.js +++ b/spec/SubscriptionDefinition.spec.js @@ -130,6 +130,17 @@ describe( "SubscriptionDefinition", function () { } ).withContext(context).defer(); sDefe.callback.call( sDefe.context, "stuff", { topic : "TestTopic" } ); } ); + + it( "Should keep the context intact when modified later", function ( done ) { + var context = { + key : 1234 + }; + sDefe = new SubscriptionDefinition( "TestChannel", "TestTopic", function ( data, env ) { + expect( this ).to.be( context ); + done(); + } ).defer().withContext(context); + sDefe.callback.call( sDefe.context, "stuff", { topic : "TestTopic" } ); + } ); } ); describe( "When delaying the callback", function () { @@ -241,4 +252,27 @@ describe( "SubscriptionDefinition", function () { sDefe.callback.call( sDefe.context, 1 ); }); } ); + + describe( "When self disposing", function () { + + it( "Should be inactive", function () { + var sDefe = new SubscriptionDefinition( "TestChannel", "TestTopic", function ( data, env ) { + } ).withContext(context).disposeAfter( 1 ); + + sDefe.callback.call( sDefe.context, "stuff", { topic : "TestTopic" } ); + + expect( sDefe.inactive ).to.be( true ); + } ); + + it( "Should keep the context intact", function ( done ) { + var context = { + key : 1234 + }; + var sDefe = new SubscriptionDefinition( "TestChannel", "TestTopic", function ( data, env ) { + expect( this ).to.be( context ); + done(); + } ).withContext(context).disposeAfter( 200 ); + sDefe.callback.call( sDefe.context, "stuff", { topic : "TestTopic" } ); + } ); + } ); } ); \ No newline at end of file diff --git a/src/SubscriptionDefinition.js b/src/SubscriptionDefinition.js index ddb78f8..badf0e0 100644 --- a/src/SubscriptionDefinition.js +++ b/src/SubscriptionDefinition.js @@ -36,11 +36,11 @@ SubscriptionDefinition.prototype = { }, defer : function () { + var that = this; var fn = this.callback; - var context = this.context; this.callback = function ( data, env ) { setTimeout( function () { - fn.call( context, data, env ); + fn.call( that.context, data, env ); }, 0 ); }; return this; @@ -50,13 +50,14 @@ SubscriptionDefinition.prototype = { if ( _.isNaN( maxCalls ) || maxCalls <= 0 ) { throw "The value provided to disposeAfter (maxCalls) must be a number greater than zero."; } + var that = this; var fn = this.callback; var dispose = _.after( maxCalls, _.bind( function () { this.unsubscribe(); }, this ) ); this.callback = function () { - fn.apply( this.context, arguments ); + fn.apply( that.context, arguments ); dispose(); }; return this; @@ -113,11 +114,11 @@ SubscriptionDefinition.prototype = { if ( _.isNaN( milliseconds ) ) { throw "Milliseconds must be a number"; } + var that = this; var fn = this.callback; - var context = this.context; this.callback = function ( data, env ) { setTimeout( function () { - fn.call( context, data, env ); + fn.call( that.context, data, env ); }, milliseconds ); }; return this;