1

ここでの最初の質問なので、うまくいけば私はこれを正しく行います...

私がやろうとしていることの冗談は、クエリ内のリストに追加し、node.jsからこのリストをクライアントに渡すことができるようにすることです。私のコード(簡略化)は次のとおりです。

socket.on('get_new', function() {   
var db = require('mongojs').connect('test', ['col1']);
var db2 = require('mongojs').connect('test', ['col2']);

db.col1.find( function(err, tups) {

    var total = [];

    if ( err || !rows ) { console.log("error") };
    else { 

          for(row in tups){ 
               var id = row['id'];

               db2.col2.find({name:id}, function(foo, bar){

                  if ( foo || !bar ) { console.log("error") }; 
                  else {

                     total += { name : bar['age'] };
                     console.log(total); //prints [ {alex:'20'}]
                  }
               }
           }
    }

  console.log(total); // prints []

}
}

コードで示したように、値を確認するためにいくつかのconsole.logステートメントを配置しましたが、クエリ内と後では異なります。このコードのスコープと関係があるのではないかと思いますdb.test2.find。実行後、内部で起こったことは外部には存在しないように見えますが、理由はわかりません。前もって感謝します!

4

1 に答える 1

0

コードは非同期です。これが実際に意味することは、最後のステートメント:console.log(total);が最初のステートメントの前に実行されるということです。実際の合計を出力するには、そのコードを次のような関数でラップします。

function myFnForTotal(notifyTotal) {

/* your code above the else  */
 total += someTotal;
 console.log(total); //prints [ {alex:'20'}]
 notifyTotal(total);
/* your code below else */
}

myFnForTotal(function(total) {
  console.log(total);
});
于 2012-06-05T20:47:04.037 に答える