Domanda

Sono confuso su come usare l'oggetto differito di JQuery e gli esempi che ho visto non mi stanno aiutando. Quello che voglio fare è 1.) Ottieni un oggetto calendario tramite una chiamata Ajax, 2.) Popola parte del mio oggetto globale (myobj) con i dati del calendario, quindi 3.) Popola un elemento di pagina con i nuovi dati in myobj . Queste tre funzioni implementano la logica e voglio chiamarle in sequenza:

function getCalendar(refDate, numDays) {
    return $.ajax({
        type: "POST",
        url: "services/Calendar.asmx/GetCalendar",
        data: '{ "refDate": "' + refDate + '", "numDays": "' + numDays + '" }',
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    }).promise();
}


function loadCalendarData(response) {
    var calData = jQuery.parseJSON(response.d);
    MYOBJ.cal.dMin = calData.dMin;
    MYOBJ.cal.dMax = calData.dMax;
    MYOBJ.cal.dates = calData.dates; // array of date strings
}


function populateCalendar (x, y, z) {
    // use data from MYOBJ.cal here
}

Non riesco a capire come fare populatecalendar () Attendere fino a quando non sia fatto LoadCalendardata (). Questo...

$.when(getCalendar(myDate, 70))
 .then(loadCalendarData)
 .then(populateCalendar(a, b, c))
 .fail(alertCalendarError);

... è ovviamente errato: è solo una variazione che ho gettato contro il muro perché non capisco cosa sto facendo ... :)

AGGIORNARE: Come sottolineano correttamente Goldennewby e Brian Oneil, potrei semplicemente attaccare la mia chiamata a Populatecalendar alla fine di Loadcalendardata. Funzionerà sicuramente. Vorrei averne pensato mentre stavo postando. Immagino che il mio obiettivo finale fosse capire come raggiungere il sequenziamento. In questo caso, tuttavia, non riesco a pensare a nessun scenario in cui lo scenario loadcalendartata sarebbe chiamato senza una chiamata a populatecalendar direttamente dopo di esso, quindi questa soluzione ha sicuramente senso. Grazie.

È stato utile?

Soluzione

Stai effettivamente eseguendo populateCalendar(a, b, c). Devi passare il riferimento alla funzione. Prova questo.

$.when(getCalendar(myDate, 70))
 .then(loadCalendarData)
 .then(function(){
     populateCalendar(a, b, c)
  })
 .fail(alertCalendarError);

Altri suggerimenti

Sembra che l'unico metodo che debba essere chiamato in modo differito è LoadCalendardata.

Chiamerei LoadCalendardata dal callback di successo della chiamata .ajax che stai facendo e quindi puoi semplicemente chiamare Populatecalendar alla fine di LoadCalendardata (come già menzionato nei commenti).

sembrerebbe qualcosa di simile ...

function getCalendar(refDate, numDays) {
    return $.ajax({
        type: "POST",
        url: "services/Calendar.asmx/GetCalendar",
        data: '{ "refDate": "' + refDate + '", "numDays": "' + numDays + '" }',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: loadCalendarData
    });
}


function loadCalendarData(response) {
    var calData = jQuery.parseJSON(response.d);
    MYOBJ.cal.dMin = calData.dMin;
    MYOBJ.cal.dMax = calData.dMax;
    MYOBJ.cal.dates = calData.dates; // array of date strings

    populateCalendar(a, b, c); //not called until MYOBJ is setup
}


function populateCalendar (x, y, z) {
    // use data from MYOBJ.cal here
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top