我有一个函数可以生成ajax GET请求,并根据返回的值设置一个全局JS变量。我使用这个变量(下面的代码中的isCalculateTax)进行进一步处理:
var isCalculateTax;
function setCalculateTaxValue(taxStatementId) {
$.get('/taxstatements/calculatetax/' + taxStatementId, function (data) {
isCalculateTax = data.isCalculateTax;
});
}
$(document).ready(function () {
// initially check the tax statements dropdown to see which one is selected
// and set the isCalculateTax to the right value
var taxStatementId = $('#taxStatements').val();
setCalculateTaxValue(taxStatementId);
enumerateDocumentItems(isCalculateTax);
});
我的问题是,当enumerateDocumentItems()被调用并执行时,isCalculateTax尚未从AJAX GET请求更新,因此我收到了不可预测的结果。
如何在执行enumerateDocumentItems()之前等待必要的时间,以便isCalculateTax正确?
答案 0 :(得分:6)
有两种方法可以做到这一点。首先,您可以更改setCalculateTaxValue
(并可能重命名它),以便它接受在检索值时执行的回调。然后,您将传递enumerateDocumentItems
作为回调。或者,这实际上违背了异步性的概念,您可以将其更改为使用$.ajax
并将aSync
选项设置为false。我推荐前者。
var isCalculateTax; // no longer needed?
function updateTaxValue(taxStatementId,callback) {
$.get('/taxstatements/calculatetax/' + taxStatementId, function (data) {
isCalculateTax = data.isCalculateTax;
if (callback) {
callback.call( taxStatementId, data.isCalculateTax );
}
});
}
$(document).ready(function () {
// initially check the tax statements dropdown to see which one is selected
// and set the isCalculateTax to the right value
var taxStatementId = $('#taxStatements').val();
updateTaxValue(taxStatementId,enumerateDocumentItems);
});
使用回调使其比直接引用回调函数更灵活一些。如有必要,它允许您将更新代码重用于多个目的。
答案 1 :(得分:1)
在设置isCalculateTax后立即从$ .get回调函数中调用enumerateDocumentItems()。
只需确保用户界面之间有意义。