return promise 链中的值未被调用
return value inside promise chain isn't getting called
我正在使用 promise 库 Bluebird,我目前 运行 遇到函数内的所有内容都运行良好的问题,但是当我尝试 return 一个值时,函数returns 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 将 return 一个可以解析为 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 结果,使最终的部分连接像 .join
一样简单 - 做这样也会正确传播任何错误,因此您对 foo 的使用可以是
foo().then(function(book) {
console.log('huzzah I have book ' + book);
}).catch(function(err) {
// handle any and all errors here
});
我正在使用 promise 库 Bluebird,我目前 运行 遇到函数内的所有内容都运行良好的问题,但是当我尝试 return 一个值时,函数returns 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 将 return 一个可以解析为 book
值的 promisefoo().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 结果,使最终的部分连接像 .join
一样简单 - 做这样也会正确传播任何错误,因此您对 foo 的使用可以是
foo().then(function(book) {
console.log('huzzah I have book ' + book);
}).catch(function(err) {
// handle any and all errors here
});