【发布时间】:2017-07-09 07:47:45
【问题描述】:
我在将 for 循环与 Promise 结合使用时遇到了很多麻烦。本质上,我的工作流程是:
- 在 Node.js 中获取一组
Artist对象,并获取它们的 使用 Mongoose 的传记和 ID。 - 使用他们的 ID 获取所有艺术品(更具体地说,所有 艺术作品关键字)由该艺术家创作。
- 在自然语言处理器分类器中训练它们(这部分
不是超级相关-只知道我需要访问
biography和keywords在同一个外部范围内。
但是,我似乎无法在 Mongoose 承诺中使用 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);
}
如您所见,我在退出承诺后尝试 console.log(),但 t 对象始终未定义。
另外,
我知道在我的示例中,bioText 在 Mongoose find() 承诺之前一直可用。但我也不知道如何将 bioText 注入到 Promise 中(因为我可以简单地在 then() 语句中训练分类器。
所以我的帖子基本上是两个问题:
- Promises 可以在
then()内部使用外部变量吗? - 如何返回在
then()中声明的变量,所以它是 在外部范围内可用?
【问题讨论】:
-
为什么要在回调函数之外访问变量
t?您可以实现类似“评估 t 时,console.log(t)”之类的逻辑,但我看不到这一点。只需将所有后续代码放在回调函数中即可。 -
@R.Saban 我可以这样做,但是如何在 then() 语句中获取我的 bioText 变量?
标签: javascript node.js mongodb mongoose