web-dev-qa-db-fra.com

Comment utiliser réellement Q promise dans node.js?

Cela peut être une question de noob, mais je suis nouveau dans les promesses et j'essaie de comprendre comment utiliser Q dans node.js.

Je vois le tutoriel commence par un

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

mais je n'arrive pas à comprendre d'où vient exactement .then. Je suppose que ça vient de

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

mais d'où vient getInputPromise()? Je n'en trouve aucune mention antérieure.


Je l'ai inclus dans mon projet comme ça

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');
});

Comment utiliser Q et son .then Ici dans mon exemple?

33
laggingreflex

promiseMeSomething() va retourner un objet Q promise, qui aura then fonction dedans, qui est defined , comme ceci

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

La façon la plus simple de créer un objet Promise serait d'utiliser le constructeur de la fonction Q, comme ceci

new Q(value)

va créer un nouvel objet de promesse. Vous pouvez ensuite attacher les gestionnaires de réussite et d'échec, comme ceci

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

De plus, si vous passez une seule fonction de style nodejs à .then fonction, il appellera cette fonction avec la valeur de succès comme celle-ci

callback(null, value)

ou s'il y a un problème, alors

callback(error)

Pour votre cas particulier, setTimeout accepte la fonction à appeler comme premier paramètre. Ainsi, il faudrait assez peu de lignes de code pour que cela fonctionne vraiment avec des promesses. Ainsi, Q a une fonction pratique, à cet effet, Q.delay , qui peut être utilisé comme ceci

var Q = require('q');

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

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

Vous pouvez l'écrire plus court comme ça

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

Si vous souhaitez appeler la fonction de rappel avec une autre valeur, vous pouvez le faire comme ceci

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

Cela va être utile lorsque vous souhaitez avoir un délai entre deux fonctions et que la deuxième fonction dépend de la première fonction.

19
thefourtheye