承诺的回报价值不是预期的

时间:2014-09-29 18:12:10

标签: javascript node.js asynchronous q

我有一些逻辑,我正在尝试构建一个“人”对象,我有一个名为getProvider的方法,其中我基本上从mongo获取提供程序并将其分配给person.provider

由于对mongo的调用是异步的,我正在尝试使用promises。除了我的.then方法之外,我记录的每个地方的值似乎都是正确的。它显示{"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;
}

1 个答案:

答案 0 :(得分:2)

people[0].provider应指向已解决的承诺。如果您附加then处理程序,您将看到预期的提供者值:

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

如果您希望将提供程序作为people数组中每个人的值,您可以按如下方式更新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
});
}