3

非同期の AJAX/JSON 投稿を介して回答をデータベースに送信するクイズを書いています。データベースは、答えが正しかったかどうかを示すインジケータを返します。

データベース呼び出しが戻るまでにかかる時間を知る方法がないため、同僚は $.Deferred の使用を推奨しました。AJAX 投稿でこれを行う明確な例を見つけることができませんでした。そして、StackOverflow の専門家の 1 人がこれに関するガイダンスを提供できると考えました。

このコードは、[回答の送信] ボタンがクリックされたときに実行される呼び出し関数にあります。

     var answerResult = recordAnswer(answer);
     if (answerResult.IsAnswerCorrect) {
        // Show student if her quiz answer was correct.
     }

これがrecordAnswer関数です。これは、オブジェクト (IsAnswerCorrect と IsQuizCompleted) でいくつかの値を返す必要があります。私のフォームは AJAX 呼び出しを正常に行っており、値が「結果」に返されています。しかし、返される 'answerResult' 値が上記の呼び出しコードで 'undefined' として返され、その結果壊れることがあります。これを遅延呼び出しに変更すると、その問題を回避できると思います。

  var recordAnswer = function (answer) {

  var quizSessionQuestionId = $('#hidden_quizSessionQuestionId').val();
  var numberOfHintsUsed = 0;

  var answerResult;

  $.ajax({
     url: QuizConfig.RecordAnswerDataAction, // Tied to RecordAnswer in BaseQuizController.
     type: 'POST',
     async: false,
     dataType: 'json',
     data: {
        "quizSessionQuestionId": quizSessionQuestionId,
        "value": answer,
        "numberOfHintsUsed": numberOfHintsUsed,
        "markCompleteIfWrong": false
     },
     success: function (result) {
        answerResult = result;
     },
     error: function (request, errorm) {
        jAlert("Unable to record answer.", "An error occurred while saving this answer.");
        return;
     }
  });

  return answerResult;
};

これを調査しているときに、上記で適用した (answerResult = result を割り当てる) パターンが「CAUTION BROKEN CODE」であることを示す次のチュートリアルを見つけました。:) http://jqfundamentals.com/chapter/ajax-deferreds

いずれにせよ、これまでの壊れたアプローチではなく、延期された方法論を使用するように上記のコードを調整する方法を教えてください。ご協力いただきありがとうございます。

4

3 に答える 3

0

return answerResult;主な問題は、この方法では、async を false に設定しているにもかかわらず、成功後に実行されることを保証できないことです。

したがって、より良いアプローチは、成功がトリガーされたときにトリガーされ、必要なことを実行するコールバック関数になると思います。呼び出しオブジェクトを recordAnswer 関数に渡し、それをコールバック関数で使用できます。

于 2013-10-31T16:46:01.610 に答える