我正在编写一个测验,通过异步 AJAX/JSON 帖子向数据库发送答案。数据库返回一个指示符来判断答案是否正确。
一位同事建议使用 $.Deferred,因为无法确定数据库调用返回需要多长时间。我一直无法找到使用 AJAX 帖子执行此操作的明确示例。我认为 StackOverflow 的一位专家可以提供这方面的指导。
此代码位于调用函数中,当单击“提交答案”按钮时会执行该函数。
var answerResult = recordAnswer(answer);
if (answerResult.IsAnswerCorrect) {
// Show student if her quiz answer was correct.
}
这是recordAnswer函数。这需要在一个对象中返回几个值(IsAnswerCorrect 和 IsQuizCompleted)。我的表单成功地进行了 AJAX 调用,并且值正在返回到“结果”。但有时返回的“answerResult”值在上面的调用代码中返回为“未定义”,因此会中断。我相信将其更改为延迟调用将避免该问题。
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 = 结果)是“CAUTION BROKEN CODE”,因为“A 代表异步”。:) http://jqfundamentals.com/chapter/ajax-deferreds
无论如何,请告诉我如何调整上面的代码以使用延迟方法,而不是我迄今为止所采用的破碎方法。谢谢你的帮助。