使用 Q 的猫鼬嵌套填充不起作用

Posted

技术标签:

【中文标题】使用 Q 的猫鼬嵌套填充不起作用【英文标题】:Mongoose Nested Populate using Q not working 【发布时间】:2015-10-06 10:29:00 【问题描述】:

我正在学习 promise,我正在尝试使用 Q 清理我的嵌套填充。

问题:层没有按顺序运行,并且生成的数据没有传递到每个连续的层。

Q().then(layerOne(aggr_data))
  .then(layerTwo)
  .then(layerThree)

function layerOne(aggr_data) 
  var options = 
      path: '_video'
    , model: 'video'
  ;
  return model_video.populate( aggr_data, options, function (err, snippet) 
    if (err) return next(err);
    return snippet;
  );
;

function layerTwo(snippet) 
  var commentOptions = 
      path: '_comments._author'
    , model: 'user'
  ;
  return model_user.populate(snippet, commentOptions, function (err, popSnippet) 
    if (err) return next(err);
    return popSnippet;
  );
;

function layerThree(popSnippet) 
  var videoOptions = 
      path: '_video._chirps._comments'
    , model: 'comment'
  ;
  return model_comment.populate(snippet, videoOptions, function (err, deepSnippet) 
    if (err) return next(err);
    next(deepSnippet);
  );
;

【问题讨论】:

IIRC,如果你得到了一个承诺,你不应该将任何回调传递给populate 您希望layerThree 在其函数体中使用snippetpopSnippet @Bergi,我很快就注意到了这个错误。感谢您指出。也摆脱了回调,它工作得很好。 【参考方案1】:

图层不按顺序运行

您的主要问题是您没有将回调传递给第一个then,而是调用的结果。 Q().then(layerOne(aggr_data)) 应该是

Q(aggr_data).then(layerOne).then(…)

或者干脆

layerOne(aggr_data).then(…)

【讨论】:

以上是关于使用 Q 的猫鼬嵌套填充不起作用的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬填充不起作用

猫鼬嵌套查找不起作用[重复]

使用数组过滤器更新多个嵌套数组在猫鼬中不起作用

在填充中排序不起作用(猫鼬)

从猫鼬模型传递嵌套的 JSON 数据不起作用

Typescript 接口 - 字段类型:MyInterface |字符串,尝试访问属性时不起作用