JQuery: Forzare pagina ad battuta d'arresto fino a quando i dati si sta caricando finito
-
26-09-2019 - |
Domanda
I potrebbe essere sbagliata su ciò che sta realmente accadendo qui ma ho 3 Html.dropdownlists. E im utilizzando jQuery per il filtraggio maniglia che funziona veramente. Tuttavia, v'è un comportamento strano e penso che potrebbe essere perché i dati isnt carico finito prima che la funzione successivo è chiamato.
Per esempio:
Alcuni retroscena. Società: possiede diversi uffici sul campo Field Office: possiede diversi facilties Così logicamente, quando si cambia società, uffici di campo dovrebbe cambiare, che poi cambia strutture.
$(function () {
$(document).ready(function () {
var cid = $("#CompanyId").val();
$.post("/ManifestSearch/GetFilteredFieldOffices", { id: cid }, function (data) {
$("#FieldOfficeId").loadSelect(data);
});
var fid = $("#FieldOfficeId").val();
$.post("/ManifestSearch/GetFilteredFacilities", { id: fid }, function (data) {
$("#FacilityId").loadSelect(data);
});
});
});
Ora, quando la pagina viene caricata, tutto sembra bene. Tutte le DropDownList hanno i dati corretti.
Quando cambio società, ciò richiede.
$(function () {
$('#CompanyId').change(function () {
var cid = $(this).val();
$.post("/ManifestSearch/GetFilteredFieldOffices", { id: cid }, function (data) {
$("#FieldOfficeId").loadSelect(data);
});
var fid = $("#FieldOfficeId").val();
$.post("/ManifestSearch/GetFilteredFacilities", { id: fid }, function (data) {
$("#FacilityId").loadSelect(data);
});
});
});
Questo cambia gli uffici di campo per l'elenco corretto, servizi, tuttavia le modifiche a tutto ciò che gli uffici di campo è stato impostato prima della modifica società si è verificato. Non so abbastanza di jQuery per capire esattamente cosa sta succedendo, ma il mio istinto mi dice che i due posti stanno accadendo allo stesso tempo, e il secondo post avviene prima che il primo è finito.
Soluzione
E 'la natura di una richiesta asincrona .. non si sa quale ordine finiranno in modo da non si può assumere sempre i dati dal primo sarà disponibile per la seconda.
Idealmente, la tua seconda richiesta dovrebbe essere all'interno della funzione di callback onSuccess della prima richiesta, con un gestore di onFailure / onError funzione di prendersi cura di eventuali problemi che si presentano.