2015-02-10 177 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