1

非同期ウォーターフォール メソッドを使用しようとしていますが、関数の 1 つに到達するとハングします。実行コンテキストに対して save() 操作が遅すぎるためだと思われますが、それが非同期のウォーターフォールを使い始めた理由であり、一連の次の関数に移動するまで値が返されるのを待つことができます (私の場合は以下の適切なデータcountedです)。

// 私のユーザーコントローラーで:

async.waterfall([
  function(callback) {
    getSubmission(id, function(submission) {
      if (submission) {
        callback(null, submission);
      }
    });
  },
  function(submission, callback) {
    var submissionId = submission._id;

    getViews(submissionId, ip, function(count) {
      if (count) {
        callback(null, count, submissionId);
      }
    });
  },
  // Those top two functions work perfectly passing what
  // I need to this one which is where I'm having trouble
  function(views, submissionId, callback) {
    // addView is called because it is actually
    // inserting a row in the db, but never returns from the caller
      addView(submissionId, ip, function(added) {
        // this callback doesn't fire
        if (added) {
          callback(null, added);
        }
      });
  },
  function(added, callback) {
    console.log(added);
  }
 ]);

これは次のとおりです(前のコードもaddView()あるユーザーコントローラー内でも):async.waterfall

var addView = function(submissionId, ip, callback) {
  Submission.addView({
    submissionId : submissionId,
    ip: ip
  }, function(err, counted) {
    if (err) {
      throw err;
    }

    if (counted) {
      callback(counted);
    }
  });
};

これは、呼び出し時に(私の提出モデルファイル内で)呼び出しているものSubmission.addView()です:

exports.addView = function(obj, fn) {
  var ip = obj.ip,
      submissionId = obj.submissionId,
      submissionView = new SubmissionView(obj);
// it gets to this point

  submissionView.save({
    ip : ip,
    submission_id : submissionId
  }, function(err, counted) {
    fn(err, counted);
  });
};
4

1 に答える 1

4

非同期が「ハング」するときはいつでも、通常はコールバックが呼び出されていないことが原因です。

すべてのコード パスでコールバックを呼び出すようにする必要があります。また、node.js 全体で使用されるパターンであるため、使用しない場合でも、非同期コールバックの最初のパラメーターをエラーとして予約することをお勧めします。一部のモジュールは、このパターンに依存しています。たとえば、ドメイン。

以下の変更を行うと、どこかにエラーが表示されることが予想されます。

getSubmission(id, function(submission) {
      if (submission) {
        callback(null, submission);
      }
    });

次のようになります。

getSubmission(id, function(err, submission) {
      if(err){
        return callback(err);
      }
      if (!submission) {
        return callback('no submission found');
      }
      callback(null, submission);
    });
于 2013-03-25T11:06:49.093 に答える