Javascript 如何访问父函数中的变量?
我想在函数中访问document中的数据如果我处理该项,如何将变量document.date放入itemstring中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('
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);
});
});