0

当我必须将 mongodb find 回调函数中的值设置为外部变量时,我遇到了一个奇怪的问题。例如:

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

谢谢!

4

2 回答 2

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();
于 2013-02-07T17:21:39.303 回答
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
于 2013-02-07T17:20:59.980 回答