我有一个函数,使得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正确?
解决方法
有两种方法可以做到这一点.首先,您可以更改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); });