【问题标题】:How can I access a variable in parent function?如何访问父函数中的变量?
【发布时间】:2014-10-28 23:12:15
【问题描述】:

如果我处理了Item,我想在函数中访问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;
}

【问题讨论】:

标签: javascript node.js


【解决方案1】:

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

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 函数的行为方式相同。 IE。也让它异步。

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
}

无论您在哪里调用 pagelist(),都可以将回调函数“完成”并在其中执行操作

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

【讨论】:

    【解决方案2】:

    试试这个: 将局部变量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;
       }
    

    享受:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2011-06-23
      相关资源
      最近更新 更多