2017-08-10 21 views
1

私はこの関数を適切なコールバックにしたいと考えています。書かれているように、コールバックは2回呼び出されます.1回は同期 'if'ステートメントと1つは非同期 'test2.save'ステートメントです。私は、私が試した例のようにカウンタコードを入れています。ボトムif文が同期しているので動作しません。私はすでにこのコードの何が間違っているか知っていますが、私はそれをより良くする方法については考えていません。mongodb関数の非同期コールバック

var postMatches = function(user1, userResults, callback) { 
    User.find({}, {username: 1, testResults: 1}, (err, users) => { 
    var counter = 0; 
    users.forEach(function(user2){ 
     counter++; 
     if(user1 !== user2.username && user2.testResults !== undefined) { 
     var test1 = new Test({ 
      username: user1, 
      match: user2.username, 
      compatability: mbti[userResults][user2.testResults], 
      alreadyMatches: false 
     }); 

     test1.save(() => { 
      var test2 = new Test({ 
      username: user2.username, 
      match: user1, 
      compatability: mbti[user2.testResults][userResults], 
      alreadyMatches: false 
      }); 

      test2.save(() => { 
      if(counter === users.length) { 
       callback(); 
      } 
      }); 
     }) 
     } else { 

     if(counter === users.length) { 
      callback(); 
     } 
     } 
    }) 
    }) 
}; 
+0

どのような場合ですか?基本的に何を達成しようとしていますか?私が得ることができるのは、ユーザーのデータベースを持っていて、いくつかのparamに基づいて入力ユーザーを照合しようとしているということです。 –

+0

この関数は、Testコレクションの2人のユーザー間のリンクを作成します。主に関数をテストするためにコールバックが必要です。私は、私のアプリが動作するためのコールバックを必要としないが、これは本当に面白い状況だと思って、それについていくつかの考えを聞きたい。 – Marc

+0

そして達成したいことは?もしuser1がuser2とマッチしなかったら、リンクを保存してください。そうでなければコールバックを返しますか?なぜあなたはtest2.saveからコールバックを呼び出していますか? –

答えて

1

コメントと質問から、ここでコードを編集しました。非同期モジュールとforEach関数を使用して、ユーザーリストを反復処理し、完了したらコールバックを返します。 asyncとforEachについて読む。これがあなたのユースケースのために働くかどうか私に教えてください。

var async = require('async') 
var postMatches = function(user1, userResults, callback) { 
    User.find({}, {username: 1, testResults: 1}, (err, users) => { 
    var counter = 0; 
    async.forEach(users,function(user2,iterate_callback){ 
     if(user1 !== user2.username && user2.testResults !== undefined) { 
     var test1 = new Test({ 
      username: user1, 
      match: user2.username, 
      compatability: mbti[userResults][user2.testResults], 
      alreadyMatches: false 
     }); 

     test1.save(() => { 
      var test2 = new Test({ 
      username: user2.username, 
      match: user1, 
      compatability: mbti[user2.testResults][userResults], 
      alreadyMatches: false 
      }); 

      test2.save(() => { 
      iterate_callback(); 
      }); 
     }) 
     } else { 
     iterate_callback(); 
     } 
    },function(err){ 
     console.log("Done iterating"); 
     return callback(); 
    }); 
    }) 
}; 
+0

test2.save -callbackはiterate_callbackを呼び出す必要があります。それ以外の場合、forEachは終了しません。 – mtkopone

+0

答えを編集しました。あなたはそれが正しい男を得た:) –

+0

これは魅力のように働いた。私は非同期foreachについて知りませんでした。レッスンをありがとう。 – Marc