estoy efectuando el refactoring de un codigo, prototipando los elementos.
lo que note es que al llamar una de las funciones que tengo : scheda.prototype.getValori
, la cual hace una llamada asincrona para cargar los datos de el area SharePoint, se me ejecuta el codigo antes de que la llamada este terminada. en efecto debugeando con el console.log
me retorna un valor nulo al interno de una de las variables del objeto.
el codigo que tengo es el siguiente :
CLASS
function shceda(){
this.ID;
this.titolo;
this.statoScheda;
this.Corpo;
this.CorpoOriginale;
this.CorpoPubblico;
this.GruppoPubblicazione;
this.versioneScheda;
this.pubblicazioneImmediata;
this.baseLegale;
this.annoAttivazione;
this.annoScadenza;
this.dataAttivazione;
this.dataScadenza;
this.commento1;
this.commento2;
this.commento3;
this.statoSchedaEsterna;
this.lookupId;
this.tipologia;
this.tConsultazione;
this.tApprovazione;
this.tAttivazione;
this.allegati = [];
this.link = [];
this.referenze;
}
scheda.prototype.getValori = function(ID, nomeLista){
$.ajax({
url: "********('"+ nomeLista +"')/items(" + ID + ")",
type: "GET",
headers: {
"ACCEPT": "application/json;odata=verbose"
},
success: function (data){
console.log(data.d.Title);
this.ID = data.d.Id;
this.titolo = data.d.Title;
this.statoScheda = data.d.StatoScheda;
this.Corpo = data.d.Corpo;
this.CorpoOriginale = data.d.CorpoOriginale;
this.CorpoPubblico = data.d.CorpoPubblico;
this.GruppoPubblicazione = data.d.Gruppo_x0020_di_x0020_pubblicazi;
this.versioneScheda = data.d.versioneScheda;
this.pubblicazioneImmediata = data.d.pubblicazione_x0020_immediata;
this.baseLegale = data.d.BaseLegale;
this.annoAttivazione = data.d.AnnoDiAttivazione;
this.annoScadenza = data.d.AnnoDiScadenza;
this.dataAttivazione = data.d.DataDiAttivazione;
this.dataScadenza = data.d.DataDiScadenza;
this.commento1 = data.d.commento1;
this.commento2 = data.d.commento2;
this.commento3 = data.d.commento3;
this.statoSchedaEsterna = data.d.StatoSchedaEsterna;
this.lookupId = data.d.lookupID;
this.tipologia = data.d.Tipo_x0020_Scheda;
this.tConsultazione = data.d.t_consultazione;
this.tApprovazione = data.d.t_approvazione;
this.tAttivazione = data.d.t_attivazione;
this.referenze = data.d.referenze;
},
error: function(err){
console.log(JSON.stringify(err));
}
})
};
y lo estoy llamando de la siguiente manera :
var proposta = new scheda();
proposta.getValori(getParameterByName("ID"), $("#DeltaPlaceHolderPageTitleInTitleArea .die a").html()) //la segunda seria el nombre de la lista
//aca va el codigo donde lleno los campos con las variables un ejemplo :
$("#titolo").html(proposta.titolo);
solo que console.log(proposta.titolo)
me retorna undefined
he probado a hacer lo siguiente :
//no funciono porque $().done() no es una funcion
$(function(){ proposta.getValori(id,nombreLista)}.done(function(){...})
//no funciono porque $().then() no es una funcion
$(function(){ proposta.getValori(id,nombreLista)}.then(function(){...})
//no me funciono tampoco
var proposta = new scheda();
proposta.getValori(...);
$(document).ready(function(){...});
//probe a meterlo en una variable y usar el done() pero tampoco:
var prop = proposta.getValori(...);
prop.done(function(){...});
//y tambien
prop.then(function(){...});
la verdad es que no se mas que probar, tendrian alguna idea de como puedo hacer ? sin tener que hacer un work arround con un setTimeout()
ya que no es para nada elegante ni 100% efectivo (personalmente no me gusta para nada esa idea).
desde ya muchas gracias!
EDIT
momentaneamente solucione de la siguiente manera :
scheda.prototype.getValori= function(id,nomeLista){
.....
stampa(); //imprimir
y simplemente agregue mi codigo en una función llamada stampa()
en la pagina donde creo el objeto.
si existe alguna otra forma que sea mejor bienvenido sea !
Momentaneamente espero alguna respuesta que talvez sea mejor como solución.