2015-02-12 53 views
5

利用藍鳥到Promisfy貓鼬,我有一系列的if/else用於通過數組循環以查看是否有參考文檔存在,否則創建一個Promise.map(函數..無極findOneAsync變量= { 「isFulfilled」:假 「isRejected」:假}?

分配findOneAsync的產物一個變量,來然後分配「variable._id」在製作一個新的文檔(主要承諾),控制檯日誌{"isFulfilled":false,"isRejected":false}

這裏有一個片段:

for (i=0; i<items.length; i++) { 
    var existingItem = Models.Items.findOneAsync({ item: items[i] }); 
    console.log("existingItem : "); 
    console.log(JSON.stringify(existingItem)); 
    console.log("existingItem._id : " + existingItem._id); 

這裏有一個日誌:

existingItem : 
{"isFulfilled":false,"isRejected":false} 
existingItem._id : undefined 

爲什麼會在existingItem變量未決的Model.Item.findOneAsync ..?

+0

我沒有看到你分配一個值'variable._id'。我們應該想象你的代碼是什麼樣的? – JLRishe 2015-02-12 06:03:40

回答

4

您的問題並不十分清楚,但我的問題是,爲什麼existingItem不是在您檢索它後立即掛起。

你知道如何使用的承諾?在大多數情況下,你需要在他們解決使用值或.then()其他承諾操縱功能得到:

var existingItem = Models.Items.findOneAsync({ item: items[i] }); 
existingItem.then(function (value) { 
    console.log("existingItem : "); 
    console.log(JSON.stringify(existingItem)); 
    console.log(JSON.stringify(value);); 
    console.log("existingItem._id : " + existingItem._id); 
}); 
+0

欣賞指針。在此處,此站:https://stackoverflow.com/questions/28482021/promise-map-not-finshing-because-subsequent-promise-join-finishes-first-promise – Stacks 2015-02-12 16:08:52

0

我想你想:

return Promise.each(items, function(item) { 
    return Models.Items.findOneAsync({item: item}).then(function(existingItem) { 
    console.log("existingItem", existingItem); 
    }); 
}); 
+0

是否有比這更好的模式:HTTPS:/ /stackoverflow.com/questions/28482021/promise-map-not-finshing-because-subsequent-promise-join-finishes-first-promise – Stacks 2015-02-12 16:09:40

0

findOneAsync()根本沒有運行完畢然而,當你開始編寫console.logs。

而且複雜的事情,它看起來像findOneAsync()返回一個承諾(狀態既不滿足,也不在你寫日誌的點卻拒絕)。

所以,如果你想存儲和記錄,找到的項目,則需要

  1. 等待承諾通過使用其.then()溫控功能, 和
  2. 解決從「解決檢索發現項目值」。 findOneAsync()應該通過發現項對象作爲參數到它的 resolve()功能(即某處內findOneAsync()會有:resolve(foundItem);)。

假設這一切,這應該工作:

for (i=0; i<items.length; i++) { 
     var findPromise = Models.Items.findOneAsync({ item: items[i] }); 
     //the next line won't run until findOneAsync finishes 
     findPromise.then(resolveResult => { 
      var existingItem = resolveResult; 
      console.log("existingItem : "); 
      console.log(JSON.stringify(existingItem)); 
      console.log("existingItem._id : " + existingItem._id); 
     } 
    }