1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00

Allow nodes to close asynchronously

This commit is contained in:
Nick O'Leary 2014-05-14 21:17:54 +01:00
parent 3ba6ad07b7
commit c317ccc36d
2 changed files with 43 additions and 14 deletions

View File

@ -17,6 +17,7 @@
var util = require("util"); var util = require("util");
var EventEmitter = require("events").EventEmitter; var EventEmitter = require("events").EventEmitter;
var clone = require("clone"); var clone = require("clone");
var when = require("when");
var flows = require("./flows"); var flows = require("./flows");
var credentials = require('./credentials') var credentials = require('./credentials')
@ -24,6 +25,7 @@ var comms = require("../comms");
function Node(n) { function Node(n) {
this.id = n.id; this.id = n.id;
this._events = new EventEmitter();
flows.add(this); flows.add(this);
this.type = n.type; this.type = n.type;
if (n.name) { if (n.name) {
@ -31,13 +33,30 @@ function Node(n) {
} }
this.wires = n.wires||[]; this.wires = n.wires||[];
} }
util.inherits(Node,EventEmitter);
Node.prototype.close = function() { Node.prototype.on = function(event,callback) {
// called when a node is removed if (event == "close") {
this.emit("close"); if (callback.length == 1) {
this.close = function() {
return when.promise(function(resolve) {
callback(function() {
resolve();
});
});
}
} else {
this.close = callback;
}
}
this._events.on(event,callback);
} }
Node.prototype.emit = function(event,args) {
this._events.emit(event,args);
}
Node.prototype.close = function() {
}
Node.prototype.send = function(msg) { Node.prototype.send = function(msg) {
// instanceof doesn't work for some reason here // instanceof doesn't work for some reason here

View File

@ -93,7 +93,7 @@ function stopFlows() {
if (activeConfig&&activeConfig.length > 0) { if (activeConfig&&activeConfig.length > 0) {
util.log("[red] Stopping flows"); util.log("[red] Stopping flows");
} }
flowNodes.clear(); return flowNodes.clear();
} }
var flowNodes = module.exports = { var flowNodes = module.exports = {
@ -120,12 +120,21 @@ var flowNodes = module.exports = {
return nodes[i]; return nodes[i];
}, },
clear: function() { clear: function() {
return when.promise(function(resolve) {
events.emit("nodes-stopping"); events.emit("nodes-stopping");
var promises = [];
for (var n in nodes) { for (var n in nodes) {
nodes[n].close(); var p = nodes[n].close();
if (p) {
promises.push(p);
} }
}
when.settle(promises).then(function() {
events.emit("nodes-stopped"); events.emit("nodes-stopped");
nodes = {}; nodes = {};
resolve();
});
});
}, },
each: function(cb) { each: function(cb) {
for (var n in nodes) { for (var n in nodes) {
@ -141,9 +150,10 @@ var flowNodes = module.exports = {
}, },
setFlows: function(conf) { setFlows: function(conf) {
return storage.saveFlows(conf).then(function() { return storage.saveFlows(conf).then(function() {
stopFlows(); return stopFlows().then(function() {
activeConfig = conf; activeConfig = conf;
parseConfig(); parseConfig();
});
}) })
}, },
stopFlows: stopFlows stopFlows: stopFlows