2010-09-27 23 views
7

Ajax GET isteği yapan ve döndürülen değere dayalı olarak bir global JS değişkeni belirleyen bir işlev var.Javascript/jQuery ile Senkronize GET isteği

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

Sorunum enumerateDocumentItems() denilen ve çalıştırıldığında isCalculateTax henüz GET isteği AJAX güncellenen olmadığını, bu yüzden öngörülemeyen alırsınız: Ben daha ileri işlemler için (aşağıdaki kodda isCalculateTax) bu değişkeni kullanan Sonuçlar.

EnumerateDocumentItems() dosyasını çalıştırmadan önce gerekli süre kadar bekleyebilirim, böylece isCalculateTax doğru olur mu?

cevap

6

Bunu yapmanın iki yolu vardır. İlk olarak, setCalculateTaxValue'u değiştirebilir (ve muhtemelen yeniden adlandırabilirsiniz), böylece değer alındığında çalıştırılan bir geri bildirimi kabul eder. Ardından, enumerateDocumentItems'u geri arama olarak geçirirsiniz. Alternatif olarak, bu gerçekten uyumsuzluk kavramına karşı çıkıyor, onu $.ajax kullanmak için değiştirebilir ve aSync seçeneğini false olarak ayarlayabilirsiniz. Eskiyi tavsiye ederim.

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

Geri arama özelliğini kullanmak, doğrudan geri arama işlevine başvurmaktan biraz daha esnek hale getirir. Gerekirse güncelleme kodunu birden fazla amaç için tekrar kullanmanıza izin verecektir.

+0

Bazı yerlerde enumerateDocumentItems'i geri arama olarak sağlamak istemezsek ne olur? Eğer idam edilmesini istemiyorsak, sadece boşluğa geçebilir miyiz? @Jochem .. yorumumu gör – mare

+0

@mare - evet, bu kod, aramayı denemeden önce geri aramanın null olmadığından emin olmak için kontrol eder. Değeri null değerine ayarlayın: "updateTaxValue (taxStatementId, null)". – tvanfosson

+0

Kodunuzda bir hata var: Function.prototype.apply öğesinin ikinci argümanı bir dizi olmalıdır [Bu hataya son ver] callback.apply (taxStatementId, data.isCalculateTax); – mare

1

EnumerateDocumentItems() öğesini, $ .get geri arama işlevinin içinden, isCalculateTax ayarlandıktan hemen sonra arayın.

Yalnızca UI'nin aralarında anlamlı olduğundan emin olun.

+0

İçinde get() Bazen, bazen her zaman değil deDocumentItems() numaralandırmak istiyoruz. – mare

İlgili konular