2010-09-27 14 views
7

Tengo una función que hace una solicitud GET ajax y, en función del valor devuelto, establece una variable JS global. Yo uso esta variable (isCalculateTax en el código de abajo) para su posterior procesamiento:Solicitud GET síncrona con Javascript/jQuery

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

Mi problema es que cuando enumerateDocumentItems() es llamado y ejecutado el isCalculateTax aún no se actualiza desde el AJAX petición GET, por lo que recibo impredecible resultados.

¿Cómo puedo esperar la cantidad de tiempo necesaria antes de ejecutar enumerateDocumentItems() para que isCalculateTax sea correcto?

Respuesta

6

Hay dos formas de hacerlo. En primer lugar, puede cambiar setCalculateTaxValue (y probablemente cambiarle el nombre) para que acepte una devolución de llamada que se ejecuta cuando se recupera el valor. A continuación, pasaría enumerateDocumentItems como devolución de llamada. Alternativamente, y esto va realmente en contra del concepto de asincronicidad, puede cambiarlo para usar $.ajax y establecer la opción aSync en falso. Recomiendo lo primero.

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

El uso de la devolución de llamada hace que sea un poco más flexible que simplemente hacer referencia directamente a la función de devolución de llamada. Le permitirá reutilizar el código de actualización para más de un propósito si es necesario.

+0

¿Qué sucede si en algunos lugares no queremos proporcionar enumerateDocumentItems como devolución de llamada? Si no queremos que se ejecute, ¿podemos pasar el nulo? ver mi comentario a @Jochem .. – mare

+0

@mare - sí, este código verifica para asegurarse de que la devolución de llamada no sea nula antes de intentar llamarlo. Simplemente configure el valor en nulo: 'updateTaxValue (taxStatementId, null)'. – tvanfosson

+0

Hay un error con su código: el segundo argumento para Function.prototype.apply debe ser una matriz [Break on this error] callback.apply (taxStatementId, data.isCalculateTax); – mare

1

Simplemente llame a enumerateDocumentItems() desde dentro de la función de devolución de llamada $ .get, justo después de que se establezca TaxalteTax.

Solo asegúrese de que la interfaz de usuario tenga sentido en el medio.

+0

Dentro del get() No puedo porque a veces queremos enumerarDocumentItems() pero no siempre. – mare

Cuestiones relacionadas