代码之家  ›  专栏  ›  技术社区  ›  mare

使用Javascript/jQuery同步获取请求

  •  7
  • mare  · 技术社区  · 15 年前

    我有一个函数,可以发出ajaxget请求,并根据返回的值设置一个全局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正确?

    2 回复  |  直到 15 年前
        1
  •  6
  •   tvanfosson    15 年前

    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); 
    });
    

    使用回调函数比直接引用回调函数更灵活。如果有必要,它将允许您为多种目的重用更新代码。

        2
  •  1
  •   Jochem    15 年前

    设置isCalculateTax之后,只需从$.get回调函数内部调用enumerateDocumentItems()。

    只是要确保用户界面在两者之间是合理的。