diff --git a/red/runtime/nodes/context/index.js b/red/runtime/nodes/context/index.js index 0927dd9c6..a409c46dc 100644 --- a/red/runtime/nodes/context/index.js +++ b/red/runtime/nodes/context/index.js @@ -268,7 +268,29 @@ function createContext(id,seed) { } context = getContextStorage(storage); } - context.set(scope, key, value, callback); + if (!Array.isArray(key) || !Array.isArray(value) || key.length !== value.length) { + context.set(scope, key, value, callback); + } else { + // If key and value are Array and each length is same, set each key-value pair. + var index = 0; + var cb = function(err, v) { + if (err) { + if (callback) { + callback(err); + } + } else { + index++; + if (index === key.length) { + if (callback) { + callback(null); + } + } else { + context.set(scope, key[index], value[index], cb); + } + } + }; + context.set(scope, key[index], value[index], cb); + } }; obj.keys = function(storage, callback) { var context; diff --git a/test/red/runtime/nodes/context/index_spec.js b/test/red/runtime/nodes/context/index_spec.js index d4f33059e..8ac1d96c2 100644 --- a/test/red/runtime/nodes/context/index_spec.js +++ b/test/red/runtime/nodes/context/index_spec.js @@ -615,6 +615,46 @@ describe('context', function() { }); }).catch(function(err){ done(err); }); }); + + it('should store multiple properties if key and value are arrays', function(done) { + Context.init({contextStorage:memoryStorage}); + Context.load().then(function(){ + var context = Context.get("1","flow"); + context.set(["foo1","foo2","foo3"], ["bar1","bar2","bar3"], "memory", function(err){ + if (err) { + done(err); + } else { + context.get(["foo1","foo2","foo3"], "memory", function(err,foo1,foo2,foo3){ + if (err) { + done(err); + } else { + foo1.should.be.equal("bar1"); + foo2.should.be.equal("bar2"); + foo3.should.be.equal("bar3"); + done(); + } + }); + } + }); + }); + }); + + it('should return an error if an error occurs in storing multiple values', function(done) { + Context.init({contextStorage:contextStorage}); + stubSet.onFirstCall().callsArgWith(3, null); + stubSet.onSecondCall().callsArgWith(3, "error2"); + stubSet.onThirdCall().callsArgWith(3, null); + Context.load().then(function(){ + var context = Context.get("1","flow"); + context.set(["foo1","foo2","foo3"], ["bar1","bar2","bar3"], "memory", function(err){ + if (err === "error2") { + done(); + } else { + done("An error occurred"); + } + }); + }).catch(function(err){ done(err); }); + }); }); describe('delete context',function(){