Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
72
rated 0 times [  79] [ 7]  / answers: 1 / hits: 23255  / 9 Years ago, wed, october 7, 2015, 12:00:00

I'm using the promise library Bluebird and I'm currently running into the issue that everything inside the function runs great, but when I try to return a value, the function instead returns undefined.



This is the promise chain:



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

});

});
}


The problem is simple: when calling foo(), it's value becomes undefined instead of book. Why am I experiencing this behaviour?


More From » node.js

 Answers
27
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;
});

});

});
}


Now foo will return a promise which can resolve to the value of book



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


To be honest, foo could be rewritten, but that's a different question altogether



FYI: you could do something like this for 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;
});
}


Messed around with the order in the second (was your only) Promise.all, and added the previous Promise results in it to make the final conatenation of parts as simple as a .join - doing it this way will also propagate any erros correctly, so your usage of foo can be



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

[#64815] Monday, October 5, 2015, 9 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
neildrews

Total Points: 166
Total Questions: 103
Total Answers: 85

Location: Moldova
Member since Sat, Aug 6, 2022
2 Years ago
neildrews questions
Fri, Feb 18, 22, 00:00, 2 Years ago
Tue, Oct 12, 21, 00:00, 3 Years ago
Tue, Mar 23, 21, 00:00, 3 Years ago
Sun, Aug 16, 20, 00:00, 4 Years ago
;