He estado golpeando mi cabeza contra esto por un tiempo y no puedo resolverlo.
Tengo main.js que crea una instancia de un objeto de usuario y la consola registra un valor de él.
principal.js
jsUser = new user(); console.log(jsUser.passTimes);Luego tengo el archivo user.js, que alberga la clase y obtiene los datos para passTimes
usuario.js
class user{ // construct the object constructor(obj){ // just set stuff up, cuz why not? this.pTimes = []; } loadPTimes(){ // return a promise return new Promise((res,rej)=>{ $.ajax({ url: './data/importantfile', type: 'post', dataType: 'json', data: { method: 'getData', termCode: termCode }, success: (data)=>{ // trigger the resolve res({ data: data, class: this }); } }); }); } get passTimes(){ // if pTimes is empty, or gone for some reason, do the following if( this.pTimes === undefined || this.pTimes.length == 0 ){ // go get that promise and do stuff this.loadPTimes().then((obj)=>{ // mom always told me I have value, and now I can prove it this.pTimes = obj.data; // send me up the chain return this.pTimes; }); }else{ // I always had value :), great send me up return this.pTimes; } } }Bastante fácil, ¿verdad? Sin embargo, cuando la página realmente carga, el archivo console.log se activa mientras la promesa/ajax aún se está ejecutando y devuelve undefined. No es lo que esperaba.
Lo que estaba tratando de hacer es, si se activa la función de obtención y no tenemos un valor establecido; vaya a obtener los datos usando ajax y espere a que esos datos regresen antes de devolver algo.
He reescrito esto de muchas maneras diferentes con diferentes resultados, pero no el resultado que estaba buscando (console.log devuelve los resultados reales de ajax).
Esperaba que alguien aquí haya usado un patrón similar, o uno mejor. Que espera datos antes de regresar.
Editado:
Tal vez mis preguntas fueron escritas con suficiente claridad. Necesito datos ajax, cuando se construye la clase o cuando se llama a la función de obtención . Tiene que estar alli.
No puede ser asíncrono porque esos datos se necesitan casi de inmediato. Así que lanzo la solicitud en una promesa, esperando que se respete la promesa y que la función get regrese cuando tenga datos.
Esto no está sucediendo, en cambio, get está devolviendo undefined como un valor mientras la solicitud de ajax aún está esperando una respuesta.
Esto debería solucionar tu problema:
class user{ // construct the object constructor(obj){ // just set stuff up, cuz why not? this.pTimes = []; } loadPTimes(){ // return a promise return new Promise((res,rej)=>{ $.ajax({ url: './data/importantfile', type: 'post', dataType: 'json', data: { method: 'getData', termCode: termCode }, success: (data)=>{ // trigger the resolve res({ data: data, class: this }); } }); }); } get passTimes(){ return (async () => { // if pTimes is empty, or gone for some reason, do the following if( this.pTimes === undefined || this.pTimes.length == 0 ){ // go get that promise and do stuff const obj = await this.loadPTimes(); // mom always told me I have value, and now I can prove it this.pTimes = obj.data; // send me up the chain return this.pTimes; }else{ // I always had value :), great send me up return this.pTimes; } })(); } } passTimes devolverá una promesa, por lo que para obtener el valor debe usar await o then/catch closure