推送后

时间:2019-01-19 14:53:06

标签: javascript arrays node.js express

我声明了一个数组,但是当我将元素推入其中时,它仍然为空。这是我的代码:

  var catsObjectId = new Array();
  var data = new Array();
  Recipe.find((err,doc3)=> {
    data = doc3;
    for (var i = 0; i < data.length; i++) {
      catsObjectId.push([]);
      data[i]['categories'].forEach((item, index) => {
        Recipecat.findOne({_id: item}, (err,result)=> {
          item = result.name;
          catsObjectId.push(item);
        });
      })
    }
    console.log(catsObjectId);
  });
  

这是食谱模式:

var recipeSchema = Schema({
  categories: [{
    type: Schema.Types.ObjectId,
    ref: 'RecipeCat',
  }]
});
  

这是Recipecat模式:

var recipecatSchema = new Schema({
    name: {
        type: String,
        required: true
    }
});

我想用它们的名称替换配方猫的objectIds。

当我登录'catsObjectId'时,它显示一个空数组。

似乎是什么问题?

谢谢!

3 个答案:

答案 0 :(得分:0)

您每次在通过for循环时都推入一个空数组。尝试删除此行。

catsObjectId.push([]);

答案 1 :(得分:0)

您必须使用promise才能控制您的代码。尝试以下代码,并告诉我是否存在错误。

Recipe.find().then(doc3 => {
    data = doc3;
    for (var i = 0; i < data.length; i++) {
      data[i]['categories'].forEach((item, index) => {
        Recipecat.findOne({_id: item}).then(result => {
          item = result.name;
          catsObjectId.push(item);
        });
      })
    }
    console.log(catsObjectId);
  })
  .catch(err => {
      console.log(err);
  });

答案 2 :(得分:0)

(我知道这个问题有点老了,但是如果您仍然需要帮助)

那是因为您要推送到array之外的callback,而async的{​​{1}}性质却没有。

这里简单解释为什么它为空

JavaScript

首先执行var catsObjectId = new Array(); var data = new Array(); Recipe.find((err,doc3)=> { // say execution 1 for (var i = 0; i < data.length; i++) { catsObjectId.push([]); data[i]['categories'].forEach((item, index) => { // say execution 2 Recipecat.findOne({_id: item}, (err,result)=> { item = result.name; catsObjectId.push(item); }); }) } // say execution 3 console.log(catsObjectId); }); 。在此execution 1中,迭代每个项目并触发forEach。然后继续执行execution 2

问题是execution 3是异步的,并且该值有时在execution 2中返回。这个未来是在执行future之后。 excution 3完成执行后,将调用Recipecat.findOne中的callback。但是then(result..已经执行,而console.log(catsObjectId)在执行时为空。

您应该在回调catsObjectId中使用catsObjectId或使用.then((data) => // use data here)使之async/await一样。

注意sync仅在await函数内部有效

async