2015-02-10 287 views
0

有人可以解釋爲什麼這不起作用,因爲我期望嗎?承諾中的承諾承諾

我想只返回在Promise.each()。then()中使用的創建或更新項目的ID。這是必要的,因爲create返回一個對象並更新一個對象數組。

Promise.each(items, function(item){ 
    if(...item doesn\'t exist...) 
    return Item.create(item) 
    .then(function (created) { 
     return created.id; 
     ///HOW DO I GET THIS ID ONLY? 
     }); 
    else { 
    return Item.update(item) 
    .then(function (updated) { 
     return updated[0].id; 
     ///AND THIS ID? 
     }); 
    } 

}).then(function(result) { 
    sails.log("THIS SHOULD BE AN ID" + JSON.stringify(result)); 
}); 

結果是整個創建的對象,而不是僅僅是id。我想返回一個只更新了ID的數組。顯然嵌套承諾是壞的,但我不知道我可以如何簡化這一點。

+2

2.x中的Promise.each返回原始數組,在迭代器內部返回僅用作發出迭代下一個索引之前等待的承諾。你想做什麼 ?你試圖返回哪個ID以及爲什麼那個ID? – Esailija 2015-02-10 11:17:53

+0

所以你說我不能? – glasspill 2015-02-10 11:19:14

+0

我編輯了我的問題,我希望很清楚我現在想要做什麼 – glasspill 2015-02-10 11:30:03

回答

3

不要使用.each使用.map到項目列表映射到項目列表:

Promise.map(items, function(item){ 
    if(...item doesn\'t exist...) 
    return Item.create(item).get("id"); // get is a shortcut to .then(fn(x){ r x.id; }) 
    else { 
    return Item.update(item).get(0).get(id); 
}).then(function(result) { 
    sails.log("Here is the array of all IDs + JSON.stringify(result)); 
}); 

如果你想一個一個地去了他們,等待他們,你可以鏈的第二.map。如果你想設置順序執行(很慢) - .map也需要一個併發參數。

正如Esailija所說 - 在3.0中each的變化會返回結果,所以您的原始代碼將無效,但實際上可以在3.0中使用。

+1

不知道獲取函數。它是一個救生員。這工作很好。如果可以的話,我會給你一個餅乾 – glasspill 2015-02-10 12:38:33