mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	| @@ -28,6 +28,8 @@ function Node(n) { | |||||||
|     this.id = n.id; |     this.id = n.id; | ||||||
|     this.type = n.type; |     this.type = n.type; | ||||||
|     this.z = n.z; |     this.z = n.z; | ||||||
|  |     this._closeCallbacks = []; | ||||||
|  |      | ||||||
|     if (n.name) { |     if (n.name) { | ||||||
|         this.name = n.name; |         this.name = n.name; | ||||||
|     } |     } | ||||||
| @@ -64,23 +66,35 @@ Node.prototype._on = Node.prototype.on; | |||||||
| Node.prototype.on = function(event, callback) { | Node.prototype.on = function(event, callback) { | ||||||
|     var node = this; |     var node = this; | ||||||
|     if (event == "close") { |     if (event == "close") { | ||||||
|         if (callback.length == 1) { |         this._closeCallbacks.push(callback); | ||||||
|             this.close = function() { |  | ||||||
|                 return when.promise(function(resolve) { |  | ||||||
|                     callback.call(node, function() { |  | ||||||
|                         resolve(); |  | ||||||
|                     }); |  | ||||||
|                 }); |  | ||||||
|             }; |  | ||||||
|         } else { |  | ||||||
|             this.close = callback; |  | ||||||
|         } |  | ||||||
|     } else { |     } else { | ||||||
|         this._on(event, callback); |         this._on(event, callback); | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| Node.prototype.close = function() {}; | Node.prototype.close = function() { | ||||||
|  |     var promises = []; | ||||||
|  |     var node = this; | ||||||
|  |     for (var i=0;i<this._closeCallbacks.length;i++) { | ||||||
|  |         var callback = this._closeCallbacks[i]; | ||||||
|  |         if (callback.length == 1) { | ||||||
|  |             promises.push( | ||||||
|  |                 when.promise(function(resolve) { | ||||||
|  |                     callback.call(node, function() { | ||||||
|  |                         resolve(); | ||||||
|  |                     }); | ||||||
|  |                 }) | ||||||
|  |             ); | ||||||
|  |         } else { | ||||||
|  |             callback.call(node); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     if (promises.length > 0) { | ||||||
|  |         return when.settle(promises); | ||||||
|  |     } else { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  |  | ||||||
| function constructUniqueIdentifier() { | function constructUniqueIdentifier() { | ||||||
|     return (1+Math.random()*4294967295).toString(16); |     return (1+Math.random()*4294967295).toString(16); | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /** | /** | ||||||
|  * Copyright 2014 IBM Corp. |  * Copyright 2014, 2015 IBM Corp. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
| @@ -73,6 +73,34 @@ describe('Node', function() { | |||||||
|                 testdone(); |                 testdone(); | ||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
|  |          | ||||||
|  |         it('allows multiple close handlers to be registered',function(testdone) { | ||||||
|  |             var n = new RedNode({id:'123',type:'abc'}); | ||||||
|  |             var callbacksClosed = 0; | ||||||
|  |             n.on('close',function(done) { | ||||||
|  |                 setTimeout(function() { | ||||||
|  |                     callbacksClosed++; | ||||||
|  |                     done(); | ||||||
|  |                 },200); | ||||||
|  |             }); | ||||||
|  |             n.on('close',function(done) { | ||||||
|  |                 setTimeout(function() { | ||||||
|  |                     callbacksClosed++; | ||||||
|  |                     done(); | ||||||
|  |                 },200); | ||||||
|  |             }); | ||||||
|  |             n.on('close',function() { | ||||||
|  |                 callbacksClosed++; | ||||||
|  |             }); | ||||||
|  |             var p = n.close(); | ||||||
|  |             should.exist(p); | ||||||
|  |             p.then(function() { | ||||||
|  |                 callbacksClosed.should.eql(3); | ||||||
|  |                 testdone(); | ||||||
|  |             }).otherwise(function(e) { | ||||||
|  |                 testdone(e); | ||||||
|  |             }); | ||||||
|  |         }); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user