2014-09-29 34 views
1

我有一些邏輯,我試圖建立一個「人」的對象,我有一個名爲getProvider的方法,其中我基本上從mongo獲取提供者並將其指定爲person.provider承諾的退貨價值不是預期的

由於對mongo的調用是異步的,我試圖使用承諾。除了在我的.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; 
} 

回答

2

people[0].provider應該在解決承諾被人指指點點。如果附加一個then處理它,你會看到預期的供應商價值:

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

我不希望提供者在人物陣列上,因爲每個人都有特定的提供者。那麼我將如何循環並分配這種方式? – Catfish 2014-09-29 18:27:34

+0

'configDone.promise.then(函數(){ \t返回addProvider(); })。然後(函數(){ \t的console.log( '後addProvider'); \t的console.log(JSON.stringify (例[0] .provider)); \t \t \t患者[0]。然後(功能(提供者){ \t \t \t \t的console.log(提供商); \t \t \t}) \t回調(NULL,人); })。fail(function(err){ \t callback(err); (提供程序){console(0).provider.then(function(provider){console);}這樣會給出錯誤'Error:TypeError:Object# has no method'then'' – Catfish 2014-09-29 18:29:43

+0

@Catfish: .log(provider);})' - 單個病人確實不是承諾。 – Bergi 2014-09-29 18:39:31