Javascript 如何访问父函数中的变量?

Javascript 如何访问父函数中的变量?,javascript,node.js,Javascript,Node.js,我想在函数中访问document中的数据如果我处理该项,如何将变量document.date放入itemstring中 function pagelist(items, res) { var db = db_login; result = "<html><body><ul>"; items.forEach(function(item) { console.log(item) db.collection('

我想在函数中访问document中的数据如果我处理该项,如何将变量document.date放入itemstring中

function pagelist(items, res) {
    var db = db_login;
    result = "<html><body><ul>";
    items.forEach(function(item) {
        console.log(item)
        db.collection('insights').findById(item._id , function(error, document) {
            console.log(document)
            if (error || !document) {
                res.render('error', {});
            } else {
            **console.log(document.date) //this value is displayed**
            }
        })

        **console.log(document.date)//this value is undefind**

        itemstring = "<li>" + item._id + "<ul><li>" + item.textScore +
            "</li><li>" + item.created + "</li><li>" + item.document +
            "</li></ul></li>";
        result = result + itemstring;
    });
    result = result + "</ul></body></html>";
    return result;
}
功能页面列表(项目、资源){
var db=db_登录;
结果=“
    ”; items.forEach(功能(项目){ console.log(项目) db.collection('insights').findById(项id,函数(错误,文档){ console.log(文档) 如果(错误| |!文档){ res.render('error',{}); }否则{ **console.log(document.date)//显示此值** } }) **console.log(document.date)//此值未定义** itemstring=“
  • ”+item.\u id+”
    • “+item.textScore+ “
    • ”+item.created+“
    • ”+item.document+ “
  • ”; 结果=结果+项目字符串; }); 结果=结果+“
”; 返回结果; }
试试这个: 将局部变量
document
分配给全局变量
doc
,并在函数外部访问

function pagelist(items, res) {
     var db = db_login;
     var doc;
     result = "<html><body><ul>";
     items.forEach(function(item) {
        console.log(item)
        db.collection('insights').findById(item._id , function(error, document) {
        console.log(document)
        doc=document; // assignment of the local variable to global variable
        if (error || !document) {
            res.render('error', {});
            } else {
            console.log(document.date)
            }})

     console.log(doc.date) // here is use of global variable

     itemstring = "<li>" + item._id + "<ul><li>" + item.textScore +
       "</li><li>" + item.created + "</li><li>" + item.document +
       "</li></ul></li>";
      result = result + itemstring;
     });
    result = result + "</ul></body></html>";
    return result;
   }
功能页面列表(项目、资源){
var db=db_登录;
var-doc;
结果=“
    ”; items.forEach(功能(项目){ console.log(项目) db.collection('insights').findById(项id,函数(错误,文档){ console.log(文档) doc=document;//将局部变量赋值给全局变量 如果(错误| |!文档){ res.render('error',{}); }否则{ console.log(document.date) }}) console.log(doc.date)//下面是全局变量的用法 itemstring=“
  • ”+item.\u id+”
    • “+item.textScore+ “
    • ”+item.created+“
    • ”+item.document+ “
  • ”; 结果=结果+项目字符串; }); 结果=结果+“
”; 返回结果; }

享受:)

当前的答案都忽略了一个关键点,即您的“child”函数是来自asyn函数的回调。它不会在“父”函数的其余部分执行之前执行

function pagelist(items, res) {
    // ... (1)
    items.forEach(function(item) {
        db.collection('insights').findById(item._id, function(error, document) {
            // this will not execute (4)
        });
        // before this (2)
    });
    // or this (3)
    // Actual order will be in that of (numbers)
    return result;
}
您唯一的选择是使父函数的行为方式与db函数的行为方式相同。也就是说,让它变得简单

function pagelist(items, done) { // <= "done"
    items.forEach(function(item) {
        db.collection('insights').findById(item._id, function(error, document) {
            // Now you can call done with document that is available here
            done(document); // or done(document.date); w/e
        });
    // return result; // Returns are useless* in asyncs
}

findById
是异步的,因此请参见以下相关问题:
app.use(function(req, res){
    pagelist(items, function(document){ // <= this will be the "done" function
        var itemstring = document.date;
        // do whatever you want with the document here.
        res.render(~);
        console.log(document.date);
    });
});