首页 文章

promise链中的返回值没有被调用

提问于
浏览
11

我'm using the promise library Bluebird and I'目前遇到的问题是函数内的所有内容运行都很好,但是当我尝试返回一个值时,该函数返回 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 而不是book . 为什么我会遇到这种行为?

1 回答

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

    在第二个(是你唯一的)Promise.all中加入了顺序,并在其中添加了先前的Promise结果,使部件的最终连接像_852542一样简单 - 这样做也会正确地传播任何错误,所以你对foo的使用可以

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

相关问题