Подтвердить что ты не робот

Как на самом деле использовать Q-обещание в node.js?

Это может быть вопрос noob, но я новичок в promises и пытаюсь выяснить, как использовать Q в node.js.

Я вижу tutorial начинается с

promiseMeSomething()
    .then(function (value) {}, function (reason) {});

но я не понимаю, откуда именно появился .then. Я предполагаю, что это происходит из

var outputPromise = getInputPromise()
    .then(function (input) {}, function (reason) {});

но откуда берется getInputPromise()? Я не упоминаю об этом ранее.


Я включил его в свой проект так

var Q = require('q');

// this is suppose, the async function I want to use promise for
function async(cb) {
    setTimeout(function () {
        cb();
    }, 5000);
}

async(function () {
    console.log('async called back');
});

Как использовать Q и его .then здесь в моем примере?

4b9b3361

Ответ 1

promiseMeSomething() собирается вернуть объект Q-обещания, в котором будет then функция , например

Promise.prototype.then = function (fulfilled, rejected, progressed) {

Самый простой способ создания объекта Promise - использовать конструктор функции Q, как этот

new Q(value)

создаст новый объект обещания. Затем вы можете присоединить обработчики успеха и отказа, например,

new Q(value)
.then(function(/*Success handler*/){}, function(/*Failure handler*/){})

Кроме того, если вы передадите одну функцию типа nodejs функции .then, она вызовет эту функцию со значением успеха, подобным этому

callback(null, value)

или если есть проблема, то

callback(error)

В вашем конкретном случае setTimeout принимает функцию, которая будет вызываться как первый параметр. Таким образом, для работы с promises потребуется всего несколько строк кода. Итак, Q имеет для этой цели удобную функцию Q.delay, которая может использоваться как

var Q = require('q');

function async() {
    return Q.delay(1000)
}

async()
.then(function() {
    console.log('async called back');
});

Вы можете написать это короче, как это

Q.delay(1000)
    .then(function() {
        console.log('async called back');
    });

Если вы хотите вызвать функцию обратного вызова с некоторым значением, то вы можете сделать это следующим образом

Q.delay(1000, "Success")
    .then(function(value) {
        console.log('async called back with', value);
    });

Это будет полезно, если вы хотите иметь задержку между двумя функциями, а вторая функция зависит от первой функции.