从mongodb回调中将值设置为外部变量

时间:2013-02-07 16:01:36

标签: javascript node.js mongoose

当我必须将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(...)结束且值未签名时,会丢失所有添加的内容(我已选中)。不幸的是我无法在这个回调函数中开发其余代码,那么即使没有“超级”运算符或类似的东西,分配这个值的方法是什么?

谢谢!

2 个答案:

答案 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