node package manager


A simple way to wait for multiple asynchronous calls to return


A simple way to wait for multiple asynchronous calls to return in Node.js.


Just a little utility class I wrote for dealing with parallel code. It lets you spin off a bunch of asynchronous operations and wait for them to finish.

Waiter is similar to other projects like Step, async, and Seq, but with a focus on parallel operations that return values.


Read three files asynchronously.

var waiter = new Waiter
var aFile = waiter(),
    bFile = waiter(),
    cFile = waiter()
fs.readFile('a.txt', aFile)
fs.readFile('b.txt', bFile)
fs.readFile('c.txt', cFile)
// wait for them to finish
waiter.waitForAll(function(error) {
    if (error) {
        // inspect individual errors in aFile.error, bFile.error, and cFile.error
        throw "oh no!"
    // do something with aFile.value, bFile.value, and cFile.value

You can call waiter() as many times as you want --- but call them all before calling waitForAll!

var files = [ ... ]
var waiter = new Waiter

var filesContent = {
    // Alternative syntax, pass a function into waiter(), and get the callback as an argument
    return waiter(function(done) {
waiter.waitForAll(function(error) {
    // do something with error or fileContents[x].value
}, 2000) // optional timeout parameter

Don't care about the values? You don't have to store the result of waiter():

var waiter = new Waiter
fs.writeFile('a.txt', 'hello a!', waiter())
fs.writeFile('b.txt', 'hello b!', waiter())
fs.writeFile('c.txt', 'hello c!', waiter())
waiter.waitForAll(function(error) {
    if (error) {
        console.error("Oh no!", error)
    } else {
        // all files have been written successfully!

Alternative syntax if you don't care about the values:

new Waiter(
    function(done) {
        fs.writeFile('a.txt', 'hello a!', done)
    function(done) {
        fs.writeFile('b.txt', 'hello b!', done)
).waitForAll(function(error) {
    // same old...


Waiter is open source software under the zlib license.