function whenAllTriggered(tokens, callback) { // returns a function that takes a single token // once this function has been called with all tokens at least once, // callback is invoked. var triggeredStates = {}, nTokens = 0, nTriggered = 0; for(var i = 0; i < tokens.length; i++) { triggeredStates[tokens[i]] = false; nTokens++; } // trigger function return function (token) { if (triggeredStates[token] === false) { triggeredStates[token] = true; nTriggered++; if (nTriggered == nTokens) { callback(); } } }; }; var trigger = whenAllTriggered(["ONE", "TWO", "THREE"], function () { console.log("Partaaaay!"); }) trigger("ONE"); trigger("THREE"); trigger("TWO"); // logs "Partaaaay!"