[!NOTE] Историческая справка: Q была фундаментальной реализацией спецификации Promises/A+ до того, как нативные промисы ES2015 и синтаксис
async/awaitстали стандартом в движках JavaScript.
Q — это библиотека промисов, созданная для Node.js и браузеров.
Создание промисов
const Q = require('q');
function asyncAction() {
const deferred = Q.defer();
fs.readFile('data.txt', 'utf8', (err, data) => {
if (err) deferred.reject(err);
else deferred.resolve(data);
});
return deferred.promise;
}
Преобразование колбэков Node.js (Nodebacks)
Q предоставляет утилиты для преобразования стандартных колбэков Node.js вида (err, result) в промисы:
const fs = require('fs');
// Q.nfcall: вызов функции в формате Node.js
Q.nfcall(fs.readFile, 'file.txt', 'utf-8')
.then((data) => console.log(data))
.catch((err) => console.error(err));
// Q.denodeify: оборачивает колбэк в функцию, возвращающую промис
const readFile = Q.denodeify(fs.readFile);
readFile('file.txt', 'utf-8').then(console.log);
Комбинаторы массивов
// Q.all: ожидает успешного разрешения всех промисов
Q.all([stepA(), stepB()])
.then(([resA, resB]) => {
console.log(resA, resB);
});
// Q.allSettled: ожидает завершения всех промисов независимо от результата
Q.allSettled([stepA(), stepB()])
.then((results) => {
results.forEach((r) => {
if (r.state === 'fulfilled') console.log(r.value);
else console.error(r.reason);
});
});