我声明了一个数组,但是当我将元素推入其中时,它仍然为空。这是我的代码:
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'时,它显示一个空数组。
似乎是什么问题?
谢谢!
答案 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