每个承诺中的嵌套承诺

时间:2015-02-10 11:15:33

标签: javascript node.js promise sails.js bluebird

有人可以解释为什么这不起作用,因为我期待它?

我试图只返回在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的数组。显然嵌套承诺很糟糕,但我不知道如何简化这一点。

1 个答案:

答案 0 :(得分: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中工作。