Javascript 返回Mongoose find()中声明的变量
我很难将for循环与承诺结合起来。本质上,我的工作流程是:Javascript 返回Mongoose find()中声明的变量,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我很难将for循环与承诺结合起来。本质上,我的工作流程是: 在Node.js中获取一组艺术家对象,并获取它们的 使用猫鼬的传记和ID 使用他们的ID获取所有艺术品(更具体地说,所有 艺术作品(关键词)由该艺术家创作 在自然语言处理器分类器中对他们进行培训(本部分 不是超级相关-只是知道我需要访问 传记和关键字在同一外部范围内 但是,我似乎无法在Mongoose承诺中使用bioText对象,而且我似乎无法返回Mongoose承诺中的关键字 if (!isBlank(bioT
艺术家
对象,并获取它们的
使用猫鼬的传记和ID传记
和关键字
在同一外部范围内bioText
对象,而且我似乎无法返回Mongoose承诺中的关键字
if (!isBlank(bioText) && bioText){
bioText = artist.BIO;
artworkIdArray.forEach((id)=> {
console.log(bioText) // <- prints correct values
var getKey = function(){
var words = Artwork.findById(id).then((artwork)=>{
console.log(bioText) // <- empty string
if(artwork.artworkKeywords.length > 0){
keywords = artwork.artistKeywords;
return keywords;
}
}
)
return words;
}
t=getKey();
t.then((t)=>{
console.log(t); // <--- always undefined
})
}, this);
}
if(!isBlank(bioText)&&bioText){
bioText=artist.BIO;
ArtworkDarray.forEach((id)=>{
console.log(bioText)//{
console.log(bioText)//0){
关键词=艺术品。艺术家关键词;
返回关键字;
}
}
)
返回单词;
}
t=getKey();
t、 然后((t)=>{
console.log(t);//
承诺可以在then()中使用外部变量吗
是的,但是你必须小心以后这些变量会发生什么。
这就是为什么console.log(bioText)
可以在DB调用之前记录一个值,然后在DB响应之后记录null
我建议您尝试立即调用模式,以确保值是预期值:
(function(x){...; console.log(x);})(bioText)
如何返回在then()中声明的变量以使其可用
在外部范围内
你不能,至少没有复杂的承诺管理,这在这里你可能不需要。
这就是为什么t=getKey();
总是未定义的原因
我认为您希望在继续处理之前获取所有值,因此您应该在一个查询中从DB中检索所有值,然后在回调中调用所有代码
您可以尝试以下方法:
Artwork
.find({_id: {$in: artworkIdArray}})
.then( (artworks) => {
var keywords = [];
artworks.forEach( (artwork) => {
if(artwork.artworkKeywords.length > 0)
keywords.append(artwork.artistKeywords);
});
// Now do your job with all the retrieved keywords
});
为什么要在回调函数外部访问变量t
?可以实现类似“当t被计算时,console.log(t)”的逻辑,但我看不出其中的意义。只需将所有后续代码放在回调函数中即可。@R.Saban这样做很好,但如何在then()中获取bioText变量语句?谢谢,但同样的问题仍然存在-我有一堆代码前面的bioText
字符串变量。我如何在then
语句中使用它们?你的bioText变量是then
语句的范围,所以我不理解你的问题。你得到了什么错误?不是。再看看我的code-我添加了一些注释来告诉您bioText作用域的位置。它是在承诺链开始之前定义的(从我获取的另一个结果集)。我没有得到错误,只是得到了一个空字符串值。非常感谢您回答这个例子中的#2.+1。您能提供一个在then()中使用外部作用域的示例吗?因为正如您在我的代码注释中所看到的,bioText在then()中是空的。从我在您的代码中所读到的内容来看,我假设bioText
稍后会被取消。因此,当执行then()
时,您的bioText
是空的,而您调用DB时它不是空的。