当我必须将mongodb find回调函数的值设置为外部变量时,我遇到了一个奇怪的问题。 e.g:
p += '<tr style="width: 165px!important;">';
photos.forEach(function(photo) {
EventPhoto.findOne({ _photo: photo._id }, function(err, doc) {
if (doc.main) {
p += '<td class="center-text"><a href="#" class="main-photo-on" onclick="javascript:changeMainPhoto("' + photo._id + '");">destaque</a></td>';
} else {
p += '<td class="center-text"><a href="#" class="main-photo-off" onclick="javascript:changeMainPhoto("' + photo._id + '");">destaque</a></td>';
}
});
});
p += '</tr>';
变量p
是每张照片都是增量的,问题是当EventPhoto.find(...)结束且值未签名时,会丢失所有添加的内容(我已选中)。不幸的是我无法在这个回调函数中开发其余代码,那么即使没有“超级”运算符或类似的东西,分配这个值的方法是什么?
谢谢!
答案 0 :(得分:2)
这不起作用,因为您正在启动异步请求而您不知道返回值何时到达。相反,您应该按顺序执行每个查找,一旦到达最后,继续执行需要执行的工作。我相信你的情况,这或多或少都是你想要的方法。
var p = '<tr style="width: 165px!important;">';
var i = -1;
var next = function() {
i++;
if (i < photos.length) {
var photo = photos[i];
EventPhoto.findOne({ _photo: photo._id }, function(err, doc) {
if (doc.main) {
p += '<td class="center-text"><a href="#" class="main-photo-on" onclick="javascript:changeMainPhoto("' + photo._id + '");">destaque</a></td>';
} else {
p += '<td class="center-text"><a href="#" class="main-photo-off" onclick="javascript:changeMainPhoto("' + photo._id + '");">destaque</a></td>';
}
next();
});
}
else {
p += '</tr>';
// TODO: Do remaining work.
}
}
next();
答案 1 :(得分:0)
非常确定你需要关闭:
编辑:没有!
p += '<tr style="width: 165px!important;">';
photos.forEach(
(function(what){
return function(photo) { //this will be forEach's iterator fn
EventPhoto.findOne({ _photo: photo._id }, function(err, doc) {
if (doc.main) {
what += '<td class="center-text"><a href="#" class="main-photo-on" onclick="javascript:changeMainPhoto("' + photo._id + '");">destaque</a></td>';
} else {
what += '<td class="center-text"><a href="#" class="main-photo-off" onclick="javascript:changeMainPhoto("' + photo._id + '");">destaque</a></td>';
}
});
}; // end of fn being returned by closure to forEach()
})(p) // pass p into the closure so the callback remembers it
); // end of forEach call
p += '</tr>'; // this will be added before the callback fires