# Please review my implementation of a simple When/Then (pseudo Promise) in javascript

I'm hoping some folks can take a few minutes to review some code I was working on today.

https://gist.github.com/1115202

Essentially, I'm doing a lot of work in Node.js at the moment and I'm a big fan of Promises.

Since 99% of the work that I'm doing involves performing several asynchronous actions and then parsing the results, I wanted something a little simpler and more light-weight that some of the other Promise/Deferred/Futures libraries that are out there.

My aim with this is to have a simple when().then() format without having to instantiate a new Promise inside each function.

The usage is like this:

when(
function(){ this.pass(1); },
function(){ this.pass(2); }
)
.then(function(results){
console.log( results );
});


In the Github gist I've linked to above, there are use cases near the bottom. Test case 1 uses timeouts, the 2nd test case uses several async http requests in Node.js and logs the total results at the end when all 3 have finished.

I'd love to hear any opinions good or bad, recommendations on how to make it better, etc.

• I use After instead of when/then. I don't think you can get much lighter then that – Raynos Jul 30 '11 at 13:01
• @Raynos how do you prevent the same function from calling after return value twice, or is that not a worry? I mean the scenario of that happening is highly unlikely. – William Jul 30 '11 at 15:27
• @Lime if you use after in a buggy manner then that's a bug you should fix. – Raynos Jul 30 '11 at 15:37
• In terms of shortening, I think you can replace the switch statement with a ternary function, unless I've missed something. gist.github.com/1115658 – William Jul 30 '11 at 15:58

1. Prevent the same when function from calling pass twice(therefore invalidating results)
2. Sends pass function as 1st argument to avoid var that = this
3. It stores the first pass arg only for simplicity instead of all arguments in results(easily switched)
4. Then function can't be called more then one
5. I removed the need for When and when functions(you could leave the separate functions for clarity if you wanted)
6. There is now only one method then and prop funcs

https://gist.github.com/1115319

Usage

when(
function(pass){setTimeout(pass,3000)},
function(pass){pass('2nd');}
)
.then(function(results){
console.log(results);
})

• Thanks for the tips Lime. Here's the updated gist gist.github.com/1115202/…. I adopted a few of your changes, including using instanceof to instantiate a new when() and having then() redefine itself. I also liked your method of passing pass() into each function as an argument, so I adopted that as well. I ended up more or less using the same style I started with, since its a bit easier for me to read through and understand the code when I need to go back to it, and hopefully others as well. What do you think of the updates? – Geuis Jul 30 '11 at 23:28
• It doesn't have some of the security/safety checks implemented above, but otherwise it looks good to me :D – William Jul 31 '11 at 4:20