5

検索クエリの結果セットを別の結果セットで使用したい。私はこの状況を英語でうまく説明できませんでした。いくつかのコードを使用してみます。

People.find( { name: 'John'}, function( error, allJohns ){
    for( var i in allJohns ){
        var currentJohn = allJohns[i];
        Animals.find( { name: allJohns[i].petName }, allJohnsPets ){
            var t = 1;
            for( var j in allJohnsPets ){
                console.log( "PET NUMBER ", t, " = " currentJohn.name, currentJohn.surname, allJohnsPets[j].name );
                t++;
            }
        }
    }
});

まず、ジョンという名前のすべての人を見つけます。それから私はそれらの人々をallJohnsと見なします。

次に、さまざまな検索クエリで、すべてのジョンのすべてのペットを1匹ずつ取得します。

2番目のコールバックでは、すべてのペットを1つずつもう一度取得します。しかし、どのジョンが彼らの所有者であるかを表示したいとき、私はいつも同じジョンを手に入れました。

したがって、問題は、すべてのJohnを2番目のネストされたコールバックに個別に送信するにはどうすればよいかということです。そうすれば、実際の所有者とペットとして一緒になります。

すべてのジョンをコピーする必要がありますが、どうすればこれを実行できるのかわかりません。

4

2 に答える 2

5

Javascriptにはブロックスコープはなく、関数スコープのみがあります。の代わりにfor .. in ..、を使用forEachすると、ループごとに新しいスコープが作成されます。

People.find( { name: 'John'}, function( error, allJohns ){
  allJohns.forEach(function(currentJohn) { 
    Animals.find( { name: currentJohn.petName }, function(err, allJohnsPets) { 
      allJohnsPets.forEach(function(pet, t) { 
        console.log( "PET NUMBER ", t + 1, " = ", currentJohn.name, currentJohn.surname, pet.name );
      });
    });
  });
});
于 2013-03-20T15:32:50.557 に答える
2

非同期の性質にもっと集中する必要があります。

People.find( { name: 'John'}, function( error, allJohns ){
    for( var i=0; i<allJohns.length; i++ ){
     (function(currJohn){
         var currentJohn = currJohn;
         Animals.find( { name: currentJohn.petName }, function(error, allJohnsPets){

             for(var j=0; j<allJohnsPets.length; j++){
       console.log( "PET NUMBER ", (j+1), " = " currentJohn.name, currentJohn.surname, allJohnsPets[j].name );
             }
          })

      })(allJohns[i]);
    }
});
于 2013-03-20T15:36:20.790 に答える