Javascript 返回Mongoose find()中声明的变量

Javascript 返回Mongoose find()中声明的变量,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我很难将for循环与承诺结合起来。本质上,我的工作流程是: 在Node.js中获取一组艺术家对象,并获取它们的 使用猫鼬的传记和ID 使用他们的ID获取所有艺术品(更具体地说,所有 艺术作品(关键词)由该艺术家创作 在自然语言处理器分类器中对他们进行培训(本部分 不是超级相关-只是知道我需要访问 传记和关键字在同一外部范围内 但是,我似乎无法在Mongoose承诺中使用bioText对象,而且我似乎无法返回Mongoose承诺中的关键字 if (!isBlank(bioT

我很难将for循环与承诺结合起来。本质上,我的工作流程是:

  • 在Node.js中获取一组
    艺术家
    对象,并获取它们的 使用猫鼬的传记和ID
  • 使用他们的ID获取所有艺术品(更具体地说,所有 艺术作品(关键词)由该艺术家创作
  • 在自然语言处理器分类器中对他们进行培训(本部分 不是超级相关-只是知道我需要访问
    传记
    关键字
    在同一外部范围内
  • 但是,我似乎无法在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);
            }
    
    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时它不是空的。