promise链里面的返回值没有被调用

我正在使用承诺库蓝鸟,我目前正在运行的问题,该函数内的一切运行良好,但当我尝试返回一个值,该函数返回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。 为什么我遇到这种行为?

 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将会返回一个可以解决书本价值的承诺

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

说实话, 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结果添加到它中,以使得部分的最终连接像.join一样简单 – 这样做也将正确地传播任何错误,所以你的foo的用法可以

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