使用q.map时如何避免破坏保证链?

时间:2015-02-03 11:53:41

标签: node.js promise q

我想我可能对承诺过于幻想。我有一系列鹅,并且在返回最终值之前我想执行任意数量的操作。我发现在第一个return语句之后,链条被破坏了。如果我的集合有10个项目,那么将在数据库中放置10个项目,但是当我尝试从下面的“return Q.all(promises)”语句构建我的API响应时,我得到空值。

为了测试,我将一个console.log语句放在一个promise中,该promise在第一个之后触发,而一个console.log在我的expressjs路由中,它正在期待鹅的详细信息。 API响应总是首先完成“[null,null]”,然后我最终获得链中第2和第3个承诺的条目。

我是如何创建这种竞争条件的,我该如何修复它?

var promises = geese.map(function(goose) {
 determineGooseType(goose.details)
  .then(function(type) {
    return recordNewGooseType(type)
  })
  .then(function(dbInsertResult) {
    we never really got here!
  })
  .catch(function(err) {
   log some stuff
  });
}

return Q.all(promises);

2 个答案:

答案 0 :(得分:1)

这意味着有两种选择:

recordNewGooseType未正确宣传或determineGooseType。具体而言 - 既然您说API响应determineGooseType返回[null, null],唯一合理的假设是recordNewGooseType应该受到指责。

这意味着已宣传的recordNewGooseType未调用resolve

你可以通过在一只鹅而不是10只鹅身上运行来验证这一点。

答案 1 :(得分:1)

你没有一系列的承诺,你有一系列undefined值(Q.all没有警告过你):你的映射器函数没有返回任何东西。您在那里错过了return声明:

var promises = geese.map(function(goose) {
  return determineGooseType(goose.details)
//^^^^^^
  .then(function(type) {
    return recordNewGooseType(type)
  })
  .then(function(dbInsertResult) {
    // now getting here before resolving the .all() promise!
  })
  .catch(function(err) {
   log some stuff
  });
}
return Q.all(promises);