Callbacks imbriqués en JavaScript

Beaucoup de bibliothèques Javascript utilisent dans leur architecture la notion de nested callbacks. Bien que pratique pour faire un code compact, ces callbacks deviennent très vite illisibles quand de nombreux niveaux sont imbriqués.

Voici un exemple en Node.js:

var fs = require('fs');

fs.mkdir('dirtest', 0777, function (err) {
  if (err) throw err;

  fs.writeFile('filetest', '', function (err) {
    if (err) throw err;

    console.log('File created');

    fs.readFile('filetest', 'UTF-8', function(err, data) {
      if (err) throw err;

      console.log(data);
    });
  });
});

Pour gérer un code Javascript de plus en plus complexe contenant plusieurs niveaux de callbacks imbriqués quelques bibliothèques Javascript ont vu le jour. Les plus utilisées sont Async et Step.

Gestion avec Async

La gestion avec Async est réellement simplifiée:

var fs = require('fs');
var as = require('async');

as.waterfall([
    function (cb) {
        fs.mkdir('dirtest', 0777, function (err) {
            if (err) throw err;

        cb(null);
        });
    },
    function (cb) {
        fs.writeFile('filetest', '', function (err) {
            if (err) throw err;

        console.log('File created');
        cb(null);
    });
    },
    function (cb) {
        fs.readFile('filetest', 'UTF-8', function (err, data) {
            if (err) throw err;

            console.log(data);
        });
    }
]);