web-dev-qa-db-ja.com

promiseチェーン内の戻り値が呼び出されていません

PromiseライブラリBluebirdを使用していますが、現在、関数内のすべてが適切に実行されるという問題が発生していますが、値を返そうとすると、関数はundefinedを返します。

これは約束の連鎖です:

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

       });

    });
}
_

問題は単純です。foo()を呼び出すと、その値は本ではなくundefinedになります。なぜ私はこのふるまいを経験しているのですか?

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

        });

    });
}

今fooはbookの値に解決できるpromiseを返します

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

正直なところ、fooは書き直すことができますが、それはまったく別の質問です

参考までに、あなたは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;
    });
}

2番目の(あなたの唯一の)Promise.allの順序をいじり、前のPromise結果をそれに追加して、部品の最終的な連結を.joinと同じくらい単純にする-この方法でこれを行うと、エラーは正しく、fooの使用法は

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