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