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
になります。なぜ私はこのふるまいを経験しているのですか?
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
});