gpt4 book ai didi

javascript - 推送后数组仍然为空

转载 作者:行者123 更新时间:2023-11-30 06:19:11 25 4
gpt4 key购买 nike

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

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

Here's the Recipe schema :

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

and Here's the Recipecat schema :

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

我想用 recipeCats 的名称替换 objectIds。

当我记录“catsObjectId”时,它显示一个空数组。

似乎是什么问题?

提前致谢!

最佳答案

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

那是因为您要推送到 回调 之外的 arrayJavaScriptasync 性质> 开始。

这是为什么它是空的简单解释

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。然后继续执行执行3

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

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

注意 await 仅在 async 函数内有效

async function getSomeNames() {
try {
const data = await Recipe.find();
// docs is an array of promises
const docs = data.map((item, index) => {
Recipecat.findOne({_id: item})
});
// items is an array of documents returned by findOne
const items = await Promise.all(docs);
// now you can map and get the names
const names = items.map(item => item.name);
} catch (e) {
// handle error
console.error(e);
}
}
getSomeNames()

关于javascript - 推送后数组仍然为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54268310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com