JS inicjalizaja obiektu

0

Witam
Uczę się obiektów w js i napotkałem problem
Napisałem takie cudo i nie wiem jak zrobić żeby metoda show miała dostęp po zaktualizowaniu zmiennej czyli po tym jak init() zakończy działanie.
Niejako żeby czekała aż init się zakończy.





var jb_Object2=function(JQuery) {
	var x="";
	init=0;
	////////////////////////////////////////
	show_=function(){
		console.log(x);
		// jezeli init =1 (done) to wyswietl show_
		
	}
	
	
	loadData=function(){
		var deferred = $.Deferred();
		
		setTimeout(function(){
			deferred.resolve();
			x='OK';
			init=1;
			//Object.prototype.show=function(data){return show_()}; 
		}, 3000)
		return deferred.promise();
		
	}	;//end Ajax
	
	//////////init///////////
	initApp=function(){
		
		var pomise_ajax= loadData();
		
		pomise_ajax.done(function(data){
			
			console.log('promise done');
			return true;
		})
		
	}	
	////////////////////////////
	return{
		init:initApp,
		show:show_
	}
	///////////////////////////
}//end object




var smog=new jb_Object2();

smog.init();
smog.show()//Wielkie nic
0

Poprawiłem
Człowiek się uczy całe życie

0

Napisz jeszcze raz, o co Ci chodzi - nie da się tego zrozumieć.

1

Nie masz zmiennej o nazwie smmog.
Gdybyś spojrzał do konsoli przeglądarki (F12, zakładka Console), to byś zobaczył, że nie zgadza się liczba nawiasów klamrowych. Nie zauważyłeś tego, bo stosujesz bardzo brzydką, nieczytelną składnię. Po każdej klamerce otwierającej powinien być znak nowej linii, to samo przed każdą klamerką zamykającą - plus odpowiedniej szerokości wcięcie.

     show_=function(){
        console.log(x);

W ogóle formatowanie masz wręcz losowe. Zadbaj o czystość kodu, niech każdy blok kodu ma nowe, identyczne dla każdej linii wcięcie, a nie raz dwa taby, raz trzy.
Zmienne DEKLARUJE się - użyj var albo let (mają nieco inny scope, ale to mało istotny tutaj szczegół) przed nazwą zmiennej.

Programowanie to nie jest wróżenie z fusów, używaj odpowiednich narzędzi, to będziesz mieć i automatyczne formatowanie kodu, i debuger, i konsolę.

0
ŁF napisał(a):

Nie masz zmiennej o nazwie smmog.
Gdybyś spojrzał do konsoli przeglądarki (F12, zakładka Console), to byś zobaczył, że nie zgadza się liczba nawiasów klamrowych. Nie zauważyłeś tego, bo stosujesz bardzo brzydką, nieczytelną składnię. Po każdej klamerce otwierającej powinien być znak nowej linii, to samo przed każdą klamerką zamykającą - plus odpowiedniej szerokości wcięcie.

     show_=function(){
        console.log(x);

W ogóle formatowanie masz wręcz losowe. Zadbaj o czystość kodu, niech każdy blok kodu ma nowe, identyczne dla każdej linii wcięcie, a nie raz dwa taby, raz trzy.
Zmienne DEKLARUJE się - użyj var albo let (mają nieco inny scope, ale to mało istotny tutaj szczegół) przed nazwą zmiennej.

Programowanie to nie jest wróżenie z fusów, używaj odpowiednich narzędzi, to będziesz mieć i automatyczne formatowanie kodu, i debuger, i konsolę.

Poprawiłem mój błąd ma być smog.
Czyli rozumiem że jak kod będzie czytelny to będzie wszystko działać?
Tak wnioskuje bynajmniej z twojej wypowiedzi, nadmienię że nie prosiłem o ocenę mojego kodu pod względem czytelności więc zdaje mi się że odpowiedz nie na temat.

0
Patryk27 napisał(a):

Napisz jeszcze raz, o co Ci chodzi - nie da się tego zrozumieć.

Chodzi mi o to że wywołuje metodę init() która obsługuje ajaxa a z tym trochę chodzi.
Chcę te dane wyświetlić za pomocą show ale dopiero po zakończeniu pobierania i obróbce.
Pytanie jest czy jest możliwość żeby inne metody wiedziały że init już zrobił swoje a jak nie to poczekały aż skończy.

0

Poczytaj o Promiseach.

0

Czytałem i nic mi nie wychodzi jedyne co udało mi się zrobić to ten z defered, nie ogarniam tematu niestety.

0

Jeżeli Twój obiekt potrzebuje wykonać dodatkowe żądanie podczas inicjalizacji, to musisz użyc promiseów.

function loadSomething() {
    return new Promise(function(res) {
        setTimeout(function() {
            res('jakaś wartość');
        }, 1000);
    });
}

var foo = {
    variable: '',
    
    init: function() {
        var self = this; 
        
        return loadSomething().then(function(variable) {
            self.variable = variable;
            // reszta rzeczy potrzebnych podczas inicjalizacji
        });
    },

    show: function() {
        console.log(this.variable);
    }
};

foo.init().then(function() {
    // tutaj Twój obiekt jest gotowy
    foo.show();
});
1

Nie bawiąc się w archeologie, można zrobić coś w tym stylu:

function someFactory() {
  let xPromise;
  
  const show = async () => {
    const x = await xPromise
    console.log(x)
  }

  const loadData = () => {
    return new Promise(resolve => setTimeout(resolve, 3000, 'OK'))
  }
  
  const init = () => {
    xPromise = loadData()
  }

  return {
    init,
    show,
  }
}

const instance = someFactory()
instance.init()
instance.show()

Nie wiem tylko po co ten init, ale nie wnikam - może w konkretnym przypadku jest CI potrzebny.

0
Maciej Cąderek napisał(a):

Nie wiem tylko po co ten init, ale nie wnikam - może w konkretnym przypadku jest CI potrzebny.

Po pierwsze wielkie dzięki o to mi chodziło.
W zasadzie to chyba po nic, tak sobie pierwszy raz tworzę moduł bo we wcześniejszych projektach ze względu na ich prostotę, zabawę z obiektami omijałem szerokim łukiem.
Postanowiłem chociaż po części się zagłębić i tak oto nasunęło mi się to pytanie jak takie ustrojstwo zaimplementować ot i już 3 dzień siedziałem i szukałem ale niestety te "obiecanki" na ogół wychodzą mi czkawką (chyba za stary już na to wszystko jestem), reasumując wielkie dzięki, a mi nie pozostaje nic innego jak ćwiczyć do bólu aż może kiedyś załapię.

0
sasiadstar napisał(a):

Poprawiłem
Człowiek się uczy całe życie

I umiera dalej głupi :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1