Node.js 在使用q.map时,如何避免打破承诺链?

Node.js 在使用q.map时,如何避免打破承诺链?,node.js,promise,q,Node.js,Promise,Q,我想我可能对承诺太花哨了。我有一个鹅数组,在返回最终值之前,我想执行任意数量的操作。我发现在第一个return语句之后,链就断了。如果我的集合有10个项,那么数据库中将恰好放置10个项,但是当我尝试从下面的“return Q.all(promissions)”语句构建API响应时,会得到空值 为了测试,我将console.log语句放在承诺中,在第一个承诺之后触发,并将console.log放在我的expressjs路由中,该路由需要关于geese的详细信息。API响应总是首先完成“[null,

我想我可能对承诺太花哨了。我有一个鹅数组,在返回最终值之前,我想执行任意数量的操作。我发现在第一个return语句之后,链就断了。如果我的集合有10个项,那么数据库中将恰好放置10个项,但是当我尝试从下面的“return Q.all(promissions)”语句构建API响应时,会得到空值

为了测试,我将console.log语句放在承诺中,在第一个承诺之后触发,并将console.log放在我的expressjs路由中,该路由需要关于geese的详细信息。API响应总是首先完成“[null,null]”,然后最终我会得到链中第二个和第三个承诺的条目

我是如何创造这种竞赛条件的,我又该如何修复它呢

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);

这意味着有两种选择:

recordNewGooseType
显示不正确,或者
determineGooseType
显示不正确。具体地说,由于您说过API响应
determinegootype
返回
[null,null]
,因此唯一合理的假设是
recordNewGooseType
是罪魁祸首

这意味着promisified
recordNewGooseType
没有调用
resolve


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

您没有承诺数组,您有一个未定义的
值数组(并且
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);

有点离题,但您的第一次回调可以缩短为
。然后(RecordNewGoosetType)
他说他再也不会到达第二次回调,然后进入链内部-虽然返回确实丢失了,但这不是(唯一)问题。@BenjaminGruenbaum:我不确定,但我解释为“API响应总是首先完成”[null,null]“然后最终我得到了第二个和第三个承诺的条目”,因为“从不”是不准确的,他只有“错误”的日志语句时间。如果在修复
返回后还有其他问题,他应该看看你的答案。