From 395b4998562767e74bf4fd39568f5740d4a97622 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 14 Jul 2021 21:10:59 +0100 Subject: [PATCH] Fix async loading of modules in function node --- .../nodes/core/function/10-function.js | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.js b/packages/node_modules/@node-red/nodes/core/function/10-function.js index 28e560005..d58b057c7 100644 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.js +++ b/packages/node_modules/@node-red/nodes/core/function/10-function.js @@ -306,34 +306,35 @@ module.exports = function(RED) { sandbox[vname] = null; var spec = module.module; if (spec && (spec !== "")) { - RED.import(module.module).then(lib => { + moduleLoadPromises.push(RED.import(module.module).then(lib => { sandbox[vname] = lib; }).catch(err => { node.error(RED._("function.error.moduleLoadError",{module:module.spec, error:err.toString()})) - moduleErrors = true; throw err; - }); + })); } } }); + if (moduleErrors) { + throw new Error(RED._("function.error.externalModuleLoadError")); + } } + const RESOLVING = 0; + const RESOLVED = 1; + const ERROR = 2; + var state = RESOLVING; + var messages = []; + var processMessage = (() => {}); + + node.on("input", function(msg,send,done) { + if(state === RESOLVING) { + messages.push({msg:msg, send:send, done:done}); + } + else if(state === RESOLVED) { + processMessage(msg, send, done); + } + }); Promise.all(moduleLoadPromises).then(() => { - const RESOLVING = 0; - const RESOLVED = 1; - const ERROR = 2; - var state = RESOLVING; - var messages = []; - var processMessage = (() => {}); - - node.on("input", function(msg,send,done) { - if(state === RESOLVING) { - messages.push({msg:msg, send:send, done:done}); - } - else if(state === RESOLVED) { - processMessage(msg, send, done); - } - }); - var context = vm.createContext(sandbox); try { var iniScript = null;