web-dev-qa-db-fra.com

la valeur de retour dans la chaîne de promesses n'est pas appelée

J'utilise la bibliothèque de promesses Bluebird et je rencontre actuellement le problème que tout à l'intérieur de la fonction fonctionne très bien, mais lorsque j'essaie de renvoyer une valeur, la fonction renvoie à la place undefined.

Voici la chaîne de promesses:

function foo() {
    createGroupMembers(parsedChat).then(function(val) {
        var members = val;

        createMessages(parsedChat, maxPages).then(function(val) {
            var messages = val;

            Promise.all([ createFrontCover(subject, firstdateOfMessages, lastDateOfMessages, isPreview), createStats(parsedChat), createBackCover(parsedChat)])
            .then(function (results) {
                var front = results[0];
                var stats = results[1];
                var backcover = results[2];

                var book = head + front + stats + members + messages + backcover;

                console.log('pages in this book: ', pages);
                console.log(book); // logs perfect values.

                return book; 
            }); 

       });

    });
}

Le problème est simple: lors de l'appel de foo(), sa valeur devient undefined au lieu de book. Pourquoi suis-je confronté à ce comportement?

13
bdv
function foo() {
    return createGroupMembers(parsedChat).then(function(val) {
        var members = val;

        return createMessages(parsedChat, maxPages).then(function(val) {
            var messages = val;

            return Promise.all([createFrontCover(subject, firstdateOfMessages, lastDateOfMessages, isPreview), createStats(parsedChat), createBackCover(parsedChat)])
                .then(function(results) {
                    var front = results[0];
                    var stats = results[1];
                    var backcover = results[2];

                    var book = head + front + stats + members + messages + backcover;

                    console.log('pages in this book: ', pages);
                    console.log(book); // logs perfect values.

                    return book;
                });

        });

    });
}

Maintenant, foo retournera une promesse qui peut se résoudre à la valeur du livre

foo().then(function(book) {
    console.log('huzzah I have book ' + book);
});

Pour être honnête, foo pourrait être réécrit, mais c'est une question tout à fait différente

FYI: vous pourriez faire quelque chose comme ça pour foo

function foo() {
    return createGroupMembers(parsedChat)
    .then(function(members) { // members
        return Promise.all([members, createMessages(parsedChat, maxPages)]);
    })
    .then(function(members_messages) {  // membersMessages
        return Promise.all([createFrontCover(subject, firstdateOfMessages, lastDateOfMessages, isPreview), createStats(parsedChat)].concat(members_messages, [createBackCover(parsedChat)]));
    })
    .then(function(results) { // front, stats, members, messages, back
        var book = head + results.join('');

        console.log('pages in this book: ', pages);
        console.log(book); // logs perfect values.

        return book;
    });
}

Je me suis amusé avec la commande dans la deuxième (c'était votre seule) Promise.all, et j'ai ajouté les résultats de la promesse précédente pour rendre la conaténation finale des pièces aussi simple qu'un .join - le faire de cette façon propagera également correctement les erreurs, donc votre utilisation de foo peut être

foo().then(function(book) {
    console.log('huzzah I have book ' + book);
}).catch(function(err) {
    // handle any and all errors here
});
24
Jaromanda X