One of "our own interpreters" (i.e not standard in JS), that I am very fond of, is js-csp [1]. It's a replica of Clojure(Script)'s core.async, or Go's channels/goroutines. It uses ES6 generator functions underneath.
James Long has written an excellent post about it [2]. I find it to be the less taxing on the mind solution for coordinating complex asynchronous processes in JS, especially when paired with transducers [3]. Furthermore, powerful Go/Clojure patterns can easily be re-used in JS.
In conjunction with CoffeeScript, the code becomes elegant and straightforward since there is no 'function*' ugliness required.
That's the least complex solution I have found to like the most. Performance and memory usage suffer a bit, but it's very straightforward to optimize if/when needed.
[1] https://github.com/ubolonton/js-csp
[2] http://jlongster.com/Taming-the-Asynchronous-Beast-with-CSP-...
[3] http://jlongster.com/Transducers.js--A-JavaScript-Library-fo...