我有一个函数,它发出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);
});

使用回调使它比直接直接引用回调函数更具灵活性。如有必要,它将使您可以将更新代码重用于多个目的。

09-17 02:55