Pregunta

Estoy confundido sobre cómo usar el objeto diferido de JQuery, y los ejemplos que he visto no me ayudan. Lo que quiero hacer es 1.) Obtenga un objeto de calendario a través de una llamada AJAX, 2.) Pueblo parte de mi objeto global (myobj) con los datos del calendario, y luego 3.) pueble un elemento de página con los nuevos datos en myobj . Estas tres funciones implementan la lógica, y quiero llamarlas en secuencia:

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
}

Sin embargo, no puedo entender cómo hacer que se haga populateCalendar () hasta que loadCalendardata () esté hecho. Este...

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

... es obviamente incorrecto, es solo una variación que he lanzado contra la pared porque no entiendo lo que estoy haciendo ... :)

ACTUALIZAR: Como señalan correctamente GoldenNewby y Brian Oneil, podría pegar mi llamada a PopulateCalendar al final de LoadCalendardata. Eso definitivamente funcionará. Ojalá hubiera pensado en eso mientras estaba publicando. Supongo que mi objetivo final era descubrir cómo lograr la secuenciación. Sin embargo, en este caso, no puedo pensar en ningún escenario en el que LoadCalendardata fuera llamado sin un llamado a PopulateCalendar directamente después, por lo que esta solución definitivamente tiene sentido. Gracias.

¿Fue útil?

Solución

En realidad estás ejecutando populateCalendar(a, b, c). Tienes que pasar la referencia de la función. Prueba esto.

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

Otros consejos

Parece que el único método que debe llamarse de manera diferida es LoadCalendardata.

Llamaría a LoadCalendArdata de la devolución de llamada de éxito de la llamada .AJAX que está haciendo y luego puede llamar a PopulateCalendar al final de LoadCalendardata (como ya se mencionó en los comentarios).

se vería algo así ...

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
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top