Reputation: 19294
I have some logic where I'm trying to build a "person" object and I have a method called getProvider
where i'm basically fetching a provider from mongo and assiging it to person.provider
.
Since the call to mongo is async, i'm trying to use promises. The value seems to be correct everywhere i've logged it except in my .then
method. It shows {"source": {}}
and I have no idea why.
Here's my output:
data =
MYPROVIDER
provider =
MYPROVIDER
after addProvider
{"source":{}}
...
configDone.promise.then(function () {
return addProvider();
}).then(function() {
console.log('after addProvider');
console.log(JSON.stringify(people[0].provider)); // SHOWS {"source": {}}. WHY IS IT DOING THIS?
callback(null, people);
}).fail(function (err) {
callback(err);
});
function addProvider() {
var promises = [];
people.forEach(function(person){
promises.push(person.provider = getProvider(person.id, db));
});
return Q.all(promises).spread(function(provider) {
console.log('provider = ');
console.log(provider); // SHOWS CORRECT PROVIDER HERE
});
}
// Gets a provider for a specific person id
var getProvider = function(id, db) {
var def = Q.defer();
db.collection('providerLists').findOne({id: id}, function (err, data) {
if (err) {
def.reject(err);
} else {
console.log('data = ');
console.log(data.ListName); // SHOWS CORRECT VALUE
def.resolve(data.ListName);
}
});
return def.promise;
}
Upvotes: 1
Views: 106
Reputation: 868
people[0].provider
should be pointing at a resolved promise. If you attach a then
handler to it you will see the expected provider value:
people[0].provider.then(function(provider) {
console.log(JSON.stringify(provider);
});
If you wanted to have the provider to be a value on each person of the people array you could update your addProvider function as follows:
function addProvider() {
var promises = [];
people.forEach(function(person){
promises.push(getProvider(person.id, db)
.then(function(provider) {
person.provider = provider;
});
});
return Q.all(promises).spread(function(provider) {
console.log('provider = ');
console.log(provider); // SHOWS CORRECT PROVIDER HERE
});
}
Upvotes: 2