0

mongodbfindコールバック関数から外部変数に値を設定する必要があるときに奇妙な問題に直面しています。例えば:

    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 に答える