J'utilise la bibliothèque de promesses Bluebird et je rencontre actuellement le problème que tout à l'intérieur de la fonction fonctionne très bien, mais lorsque j'essaie de renvoyer une valeur, la fonction renvoie à la place undefined
.
Voici la chaîne de promesses:
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;
});
});
});
}
Le problème est simple: lors de l'appel de foo()
, sa valeur devient undefined
au lieu de book. Pourquoi suis-je confronté à ce comportement?
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;
});
});
});
}
Maintenant, foo retournera une promesse qui peut se résoudre à la valeur du livre
foo().then(function(book) {
console.log('huzzah I have book ' + book);
});
Pour être honnête, foo
pourrait être réécrit, mais c'est une question tout à fait différente
FYI: vous pourriez faire quelque chose comme ça pour 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;
});
}
Je me suis amusé avec la commande dans la deuxième (c'était votre seule) Promise.all, et j'ai ajouté les résultats de la promesse précédente pour rendre la conaténation finale des pièces aussi simple qu'un .join
- le faire de cette façon propagera également correctement les erreurs, donc votre utilisation de foo peut être
foo().then(function(book) {
console.log('huzzah I have book ' + book);
}).catch(function(err) {
// handle any and all errors here
});