Catfish
Catfish

Reputation: 19294

Returned value from promise is not what is expected

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

Answers (1)

Gordon Bockus
Gordon Bockus

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

Related Questions