4

node / express / mongooseを使用してサイトを構築していますが、送信を表示するときに次のことを行う必要があります。

私が遭遇している問題は、非シリアル方式でdbフェッチを実行することです。たとえば、いくつかのデータをフェッチするためにいくつかの呼び出しを実行しますが、実行コンテキストが他のコンテキストに移動するまで、いくつかの呼び出しが終了しない場合があります。npmモジュールasyncを使おうとしましたが、どのように統合するかを理解するのに問題があります。

これが私のコードです:

var getViewCount = function(submissionId) {
  Submission.getSubmissionViewCount({
    submissionId : submissionId
  }, function(err, count) {
    if (err) {
      throw err;
    }

    if (count) {
      return count;
    }
  });
};

var getVotes = function(submissionId) {
  console.log('getvotes');
  Submission.getSubmissionVotes({
    submissionId : submissionId
  }, function(err, votes) {
    return votes;
  });
};

var getSubmission = function(id) {
  Submission.getSubmission({
    id : id
  }, function(err, submission) {
    if (err) {
      throw err;
    }

    if (submission) {
      return submission;
    }
  });
};

var renderSubmission = function(title, submission, views) {
  res.render('submission', {
      title: submission.title + ' -',
      submission: submission,
      views: views.length
  });
};

これを非同期で使用するにはどうすればよいですか?または、async.seriesisntead ofを使用する必要がありasync.asyncますか?

async.series([
  function(callback) {
    var submission = getSubmission(id);
    callback(null, submission);
  },
  function(callback) {
  //  getViewCount(submissionId);
  },
  function(callback) {
//    getVotes(submissionId);
  },
  function(callback) {
    //renderSubmission(title, submission, views);
  }
  ], function(err, results) {
    console.log(results);
  });

基本的に、最初にビューと投票を取得してから、送信をレンダリングしたいと思います。

4

1 に答える 1

2

コードに加える必要がある全体的な構造上の変更についての TheBrain の説明は正確です。Node の基本的な方法論は、一連のコールバックをネストすることです。実際に値を返す関数が必要になることはほとんどありません。代わりに、コールバックをパラメーターとして受け取り、結果をそのコールバックに渡す関数を定義します。明確にするために、以下のコードを確認してください (cbはコールバック関数です)。

var getViewCount = function(submissionId, cb) {
    Submission.getSubmissionViewCount({
        submissionId : submissionId
    }, function(err, count) {
        if (err) {
            throw err;
        }

        if (cb) {
            cb(count);
        }
    });
};

var getVotes = function(submissionId, cb) {
    console.log('getvotes');
    Submission.getSubmissionVotes({
        submissionId : submissionId
    }, function(err, votes) {
        if (cb) {
            cb(votes);
        }
    });
};

var getSubmission = function(id, cb) {
    Submission.getSubmission({
        id : id
    }, function(err, submission) {
        if (err) {
            throw err;
        }

        if (cb) {
            cb(submission);
        }
    });
};

var renderSubmission = function(submissionId) {

    getSubmission(submissionId, function (submission) {
        if (!submission) {
            // unable to find submission
            // add proper error handling here
        } else {
            getViewCount(submissionId, function (viewCount) {
                res.render('submission', {
                    title: submission.title + ' -',
                    submission: submission,
                    views: viewCount
                });
            });
        }
    };
};
于 2013-03-22T15:20:55.587 に答える