2

以下のコードスニペットをご覧ください。2番目のMongoDBクエリは、最初のクエリの結果を取得した後でのみ実行する必要があります。しかし、ご想像のとおり、この順序では発生しません。

db.collection('student_profile', function (err, stuColl) {
  //This if-else can be refactored in to a seperate function
  if (req.params.stuId == req.header('x-stuId')) {
    var stuInQuestion = student;
  } else {
    var stuInQuestionId = new ObjectID.createFromHexString(req.params.stuId);
    stuColl.findOne({
      '_id': stuInQuestionId
    }, function (err, stuInQuestionObj) {
      if (!stuInQuestionObj) {
        process.nextTick(function () {
          callback(null);
        });
      } else {
        var stuInQuestion = stuInQuestionObj;
      }
    });
  }

  stuColl.find({
    '_id': {
      $in: stuInQuestion['courses']
    }
  }).limit(25).sort({
    '_id': -1
  }).toArray(function (error, courses) {
    if (error) {
      process.nextTick(function () {
        callback(null);
      });
    } else {
      process.nextTick(function () {
        callback(courses);
      });
    }
  });
});

それで、ここでの私の選択は何ですか?

  1. 制御フローライブラリを必要としない方法でこれをコーディングする方法はありますか?はいの場合、誰かが私に方法を教えてもらえますか?

  2. これで制御フローライブラリを使用する必要がある場合、どちらを使用すればよいですか?asynch、FuturesJs、他に何かありますか?

4

2 に答える 2

4

これらのライブラリはバックグラウンドでコールバックを使用しているだけなので、制御フローライブラリは必要ありません。

次のようなものを試してください。

db.collection('student_profile', function (err, collection) {

  // Suppose that `firstQuery` and `secondQuery` are functions that make your
  // queries and that they're already defined.
  firstQuery(function firstCallback(err, firstRes) {

    // Do some logic here.

    // Make your second query inside the callback
    secondQuery(function secondCallback(err, secondRes) {
      // More logic here
    });
  });
});

基本的に、実行したいのは、最初のクエリのコールバック内から2番目のクエリを呼び出すことです。

これは、深くネストされているように思われるかもしれません。これが問題になる場合は、関数をすべてインライン化する代わりに関数を定義し、モジュール内でロジックをラップすることで、問題を軽減できます。

于 2012-05-22T04:30:33.497 に答える
0

私は関数を作成し、findStudent両方の場合にそれを呼び出させます:

db.collection('student_profile', function (err, stuColl) {
  //This if-else can be refactored in to a seperate function
  if (req.params.stuId == req.header('x-stuId')) {
    return findStudent(student);
  } else {
    var stuInQuestionId = new ObjectID.createFromHexString(req.params.stuId);
    stuColl.findOne({
      '_id': stuInQuestionId
    }, function (err, stuInQuestionObj) {
      if (!stuInQuestionObj) {
        process.nextTick(function () {
          callback(null);
        });
      } else {
        return findStudent(stuInQuestionObj);
      }
    });
  }

  function findStudent(stuInQuestion) {
    stuColl.find({
      '_id': {
        $in: stuInQuestion['courses']
      }
    }).limit(25).sort({
      '_id': -1
    }).toArray(function (error, courses) {
      if (error) {
        process.nextTick(function () {
          callback(null);
        });
      } else {
        process.nextTick(function () {
          callback(courses);
        });
      }
    });
  }
});
于 2012-05-22T04:26:50.243 に答える