2010-09-27 153 views
7

我有一個函數,使得ajax GET請求和基於返回的值設置一個全局JS變量。我使用這個變量(isCalculateTax在下面的代碼),以便進一步處理:Javascript/jQuery同步GET請求

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正確?

回答

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

使用回調使其比直接引用回調函數更靈活。它將允許您在必要時重用更新代碼以實現多種目的。

+0

如果在某些地方我們不想提供enumerateDocumentItems作爲回調呢?如果我們不希望它被執行,我們可以傳遞null嗎?看到我對@Jochem的評論.. – mare 2010-09-27 18:00:41

+0

@mare - 是的,此代碼在嘗試調用它之前檢查以確保回調是非空的。只需將該值設置爲空值:'updateTaxValue(taxStatementId,null)'。 – tvanfosson 2010-09-27 18:02:54

+0

您的代碼有錯誤:Function.prototype.apply的第二個參數必須是數組 [Break on this error] callback.apply(taxStatementId,data.isCalculateTax); – mare 2010-09-27 21:55:15

1

只需在設置isCalculateTax之後從$ .get回調函數內調用enumerateDocumentItems()即可。

只要確保UI之間有意義。

+0

get()我不能,因爲有時我們想要做enumerateDocumentItems(),但並非總是如此。 – mare 2010-09-27 18:00:01