Použijte Promises místo zpětných volání s promisify-node

Jedním z důvodů, proč tak milujeme sliby, je ten, že nám umožňují vyhnout se nechvalně známému peklu zpětného volání, které jsme všichni zažili v těchto prvních dnech Node.js. Když vidím rozhraní API, které nepoužívá vzor slibu, jsem naštvaný. Naštěstí jsem našel promisify-node, modul, který zabaluje funkce nebo objekty do obálky slibů, takže se můžete vyhnout nepořádku se zpětným voláním!

Existuje několik různých způsobů, jak použít promisify-node. První je zabalit jedinou funkci do slibu:

var promisify = require('promisify-node');

function async(callback) {
  callback(null, true);
}

// Convert the function to return a Promise.
var wrap = promisify(async);

// Invoke the newly wrapped function.
wrap().then(function(value) {
  console.log(value === true);
});

Můžete dokonce rekurzivně zabalit funkce modulu Node.js:

var promisify = require('promisify-node');
var fs = promisify('fs');

// This function has been identified as an asynchronous function so it has
// been automatically wrapped.
fs.readFile('/etc/passwd').then(function(contents) {
  console.log(contents);
});

A pak můžete zabalit metody objektu:

var promisify = require('promisify-node');

var myObj = {
  myMethod: function(a, b, cb) {
    cb(a, b);
  }
};

// No need to return anything as the methods will be replaced on the object.
promisify(myObj);

// Intentionally cause a failure by passing an object and inspect the message.
myObj.myMethod({ msg: 'Failure!' }, null).then(null, function(err) {
  console.log(err.msg);
});

Vzhledem k tomu, že mnoho front-endových rozhraní API přechází na rozhraní API založená na Promise, bylo by skvělé použít něco jako Promisify, abyste si je zvykli používat na straně serveru i klienta. Upozorňujeme však, že tento modul používá fragment kódu k detekci argumentů funkce. Pokud nepoužíváte často používaný název argumentu zpětného volání, například callback nebo cb , funkce promisify-wrapped nemusí fungovat správně.