承诺的退货价值不是预期的

我有一些逻辑,我试图build立一个“人”对象,我有一个名为getProvider的方法,我基本上从mongo获取提供者并将其分配给person.provider

由于对mongo的调用是asynchronous的,我试图使用promise。 除了我的.then方法之外,在任何地方logging它的值似乎都是正确的。 它显示{"source": {}} ,我不知道为什么。

这是我的输出:

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

people[0].provider应该指出一个解决的承诺。 如果你附加一个处理程序,你会看到预期的提供者值:

 people[0].provider.then(function(provider) { console.log(JSON.stringify(provider); }); 

如果你想让提供者成为人数组中每个人的价值,你可以更新你的addProvider函数,如下所示:

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