task-runner

Simple task runner for JavaScript

npm install task-runner
16 downloads in the last week
18 downloads in the last month

taskrunner.js

Simple task runner for JavaScript, either in Node.js or in the browser.

Node.js

Install using npm npm install task-runner then use with require:

var TaskRunner = require('task-runner').TaskRunner,
    Task = require('task-runner').Task;

Browsers

Clone the git repo git clone https://github.com/steveukx/taskrunner.js and include the lib/taskrunner.js file then use with the global variables TaskRunner and Task.

Usage

Tasks are essentially just functions that are scheduled to run one after each other. To ensure that long running tasks don't block the UI thread in the browser, or hold up the node.js server for longer than necessary, each task is run on the next available tick.

The functions wrapped as Task instances are called with a single argument which is a function that should be used to tell the TaskRunner that the Task is now complete. This function can be passed to any long running process (for example accessing the file system, making remote HTTP calls or querying a database).

The TaskRunner's start method can accept a function argument to use as a callback for when all tasks have finished running.

Examples

Simple usage - create a TaskRunner, set up a task that is asynchronous (making an external call using jQuery's ajax function) the do something else. Both tasks are functions that use the asynchronous model, and are started by using taskRunner.start().

var taskRunner = new TaskRunner();

// make a remote call
taskRunner.push(function(next) {
  jQuery.ajax( 'someUrl', {
     success: function(data) {
        // use the remote call data
        next();
     }
  }
});

// once that call is done with, do other things
taskRunner.push(function(next) {
  // do something
  next();
});

taskRunner.start();

The alternative simple usage pattern is to push Task instances into the TaskRunner:

function makeRequest(next) {
  jQuery.ajax( 'someUrl', {
     success: function(data) {
        // use the remote call data
        next();
     }
  }
}

function afterRequest(next) {
  // do something
  next();
}

var taskRunner = new TaskRunner();
taskRunner.push(new Task(makeRequest));
taskRunner.push(new Task(afterRequest));
taskRunner.start();

To run the same process but be informed when the tasks have been completed, pass a callback function to the start method:

document.body.className = 'loading';
var taskRunner = new TaskRunner();
taskRunner.push(new Task(makeRequest));
taskRunner.push(new Task(afterRequest));
taskRunner.start(function() {
  document.body.className = '';
});

Tasks that don't start any asynchronous processes can be created as synchronous tasks, these tasks are still called in the same way as regular asynchronous tasks, but they don't need to call the next method for themselves as this will be done automatically.

var synchronousTask = new Task(function() {}, 'name-s', false);
var asynchronousTask = new Task(function(next) { next(); }, 'name-a', true);

var taskRunner = new TaskRunner();
taskRunner.push(synchronousTask);
taskRunner.push(asynchronousTask);
taskRunner.start();

Notice that the synchronous task doesn't need to call anything to allow the TaskRunner to continue with other Tasks.

Tasks that use the next handler function can supply both error and results back to the TaskRunner, the results are then available as taskRunner.result() as an object using the name of the task as a key.

new TaskRunner()
  .async('stepOne', function (next) { next(null, "Returned value" })
  .start(function (taskRunner) {
     var result = taskRunner.result();
     // result.stepOne === "Returned value"
  });
npm loves you