fboës - Der Blog

Node.js Pattern: Promise()

Gerade für PHP-Programmierer ist die eventbasierte Programmierung in Javascript bzw. node.js eine Umstellung im Denken. Dabei sind Events die besondere Stärke, wenn man sie denn richtig anfasst.

Dabei „horcht“ ein Stückchen Programmierung mittels eines Event-Listeners, ob ein bestimmtes Event ausgelöst wird. Wenn man das Javascript von Browsern noch kennt, sind Event-Listener eigentlich schon bekannt. Zumindest in node.js gibt es aber eine deutlich kompaktere Schreibweise für bestimmte Vorgänge.

Mein Anwendungsfall: Ich warte auf eine bestimmte Anzahl von Events, und löse mein eigenes Event aus, wenn alle meine Sub-Events erfolgreich abgeschlossen haben. Bisher sah das so aus (schon mit der Kraft von Array.forEach):

  var files = ['a.txt','b.txt','c.txt'];
  var processed = 0;

  var checkProcessed  = function(err) {
    if (err) {
      console.log("Error!");
    }
    if (++processed === files.length) {
      console.log("Done!");
    }
  };

  files.forEach(function(file) {
    fs.writeFile(file, "Test test test", checkProcessed);
  });

Seit geraumer Zeit bzw. Node 4.x gibt es nämlich Promise. Der eigentlich Aufbau eines Promise wird an vielen Stellen hinlänglich erklärt. Zusammen mit Array.map erlaubt das folgende Konstruktion:

  var files = ['a.txt','b.txt','c.txt'];

  // Making promises
  var promises = files.map(function(file) {
    return new Promise (
      function (resolve, reject) {
        fs.writeFile(file, "Test test test", function(err) {
          if (err) {
            reject;
          } else {
            resolve;
          }
        });
      }
    );
  });

  // Checking promises
  Promise
    .all(promises)
    .then(function() {
      console.log("Done!");
    })
    .catch(function(err) {
      console.log("Error!");     
    })
  ;
};

Noch einfacher wird dieses Beispiel, wenn die Methode, auf die man wartet, nicht ein Event, sondern direkt ein Promise zurückgibt:

  var fsp   = require('fs-promise');
  var files = ['a.txt','b.txt','c.txt'];

  // Making promises
  var promises = files.map(function(file) {
    return fsp.writeFile(file, "Test test test");
  });

  // Checking promises
  Promise
    .all(promises)
    .then(function() {
      console.log("Done!");
    })
    .catch(function(err) {
      console.log("Error!");     
    })
  ;
};

Viele node.js-Bibliotheken, die vormals mit Events funktionierten, gibt es inzwischen auch als Variante mit Promises. So existiert z.B. das Projekt „Modernize node.js“, dass viele Events in Promises umwandelt.

Zuletzt geändert am

fboës - Der Blog

Zur Übersichtsseite