• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Model Obserwatora stanu.

Object Storage Arubacloud
0 głosów
269 wizyt
pytanie zadane 25 lipca 2016 w JavaScript przez ShiroUmizake Nałogowiec (46,300 p.)

Z góry nie chodzi mi, o addEventListenera ^^. Chodzi mi  o typowego obserwatora, którego zadaniem będzie obserwowanie jednego z pól oraz by reagował na zmianę stanu pola. Próbowałem przez promises, (rób coś, kiedy dostaniesz coś); Czyli:

return validator.getState().then(function(state){
    console.log("my State is " + state)});

Niestety dalej zwraca undefined.(nie czeka na zakończenie procesu w obiektcie validator, a natychmiastowo wywołuje metodę getState(), zanim ta klasa ustawi stan).

Owszem, mógłbym "jakieś kocie zabawy" sobie urządzić, bawiąc setInterval i badając stan obiektu co określony czas, ale nie po to został stworzony setInterval. Mógłbym również badać stan metody na wyjściu i jest to rozwiązanie. Ale chciałbym trzymać pewnych wzorców projektowych. 

Wiem, że nodeJS pozwala tworzyć własnych emiterów?. Ale, w ten temat jeszcze się nie zagłębiałem.

Drugim rowiązaniem jest MVC. Ale tutaj to jest dla mnie czarna magia xD.

Słyszałem, że w kolejnej wersji standardu JS, ma wejść Observer. Czy istnieje jakieś narzędzie, które to wykorzystuje i implementuje , a zarazem nie jest wielkie (angaluar, backbone etc.), czy bez tego się nie obejdzie :/.

PS: tak wiem, powinna być utworzona osobna klasa Observer by spełnić wzorzec projektowy :).

1 odpowiedź

0 głosów
odpowiedź 25 lipca 2016 przez Comandeer Guru (601,510 p.)

Słyszałem, że w kolejnej wersji standardu JS, ma wejść Observer

To źle słyszałeś. Nie w kolejnej (bo propozycja jest na stage 1) a w jednej z kolejnych i nie Observer a Observable :P

 Niestety dalej zwraca undefined.(nie czeka na zakończenie procesu w obiektcie validator, a natychmiastowo wywołuje metodę getState(), zanim ta klasa ustawi stan).

Brzmi jakbyś źle używał promise tak po prawdzie. 

komentarz 25 lipca 2016 przez ShiroUmizake Nałogowiec (46,300 p.)

W sumie jest to możliwe, gdyż w validatorze wywołany jest fetch i przez to wynika opóżnienie, Wtedy powinno promise lecieć od init. Jednakże, promise (ten obecny) powinen się wywołać tylko dopiero wtedy, gdy otrzyma jakąś zwracaną wartość. No chyba, że odrazu odwołuje się do przyczepionej metody do obiektu i sam ją inicjuje. To wtedy zgadza się zwróci undefined.

Znalazłem coś takiego jak object.watch. Zrobiłem coś takiego:

 validator.watch(validator.state , function (id, oldValue, newValue){this.YAY;});
  

Niestety nie zareagował na zmianę stanu. Nie wiem, z czego to wynika (może, że to już jest nieużywany standard) tak czy siak błędu nie wyrzuca.

Próbowałem znależć zdarzenie co by odpowiadało na zmianę właściwości pola w klasie w addEventListener, lecz niestety nie mogłem znależć. Wiesz, czy takie coś istnieje :)?

 

komentarz 25 lipca 2016 przez Comandeer Guru (601,510 p.)

Istniało Object.observe, ale zostało wycofane. Istnieją Proxy pozwalające opakowywać obiekty i reagować na wszelkie próby dostępu do niego. Istnieją także settery/gettery z ES5.

komentarz 25 lipca 2016 przez ShiroUmizake Nałogowiec (46,300 p.)
Pomyśle nad tym proxy. Jednakże, rozwiń myśl dotycząca setters/getters , bo nie dokońca rozumiem, jakby to miało rozwiązać mój problem. (Stan musi być monitorowany na bieżąco).
komentarz 25 lipca 2016 przez Comandeer Guru (601,510 p.)
Jeśli zrobisz setter, to przecież on może wywoływać jakąś funkcję i dzięki temu będzie monitorowanie.
komentarz 26 lipca 2016 przez ShiroUmizake Nałogowiec (46,300 p.)

Ok, próbowałem ciągnąc promise od samego init, ale dalej ten rzuca błędem, że nie wie co to validState. Nie wiem dlaczego ;/, Może coś poradzisz ?

  var  validState = validator.init();
    validState.then(function( state ) {
    console.log(state);
});
    

Moduł validator.js

ar Validator = function(salaryZl,salaryGr,dayHour,nightHour,isEmploy){
    this.salaryZl = salaryZl;
    this.salaryGr = salaryGr;
    this.dayHour = dayHour;
    this.nightHour = nightHour;
    this.isEmploy = isEmploy;
    this.state = false;
    this.salary;
}

module.exports = Validator;

Validator.prototype.init = function (){
        if (!this.checkerValue() || !this.parserValue()  ){
            this.setState(false);
            return false;
        }
        if (this.checkerValue() && this.parserValue()){
            if(this.checkCriteria()){
                this.setState(true);
                return true;
            }
   
}

}


Validator.prototype.checkerValue = function (){
     if (!this.iSeeSalary()){
              var Error = new (require('./Error.js'))();
              Error.emptyValueSalary();
              return false;
    }
    if (this.salaryGr == "" ) this.salaryGr = 0;
    if (this.isEmploy == false || this.nightHour == ""  ) this.nightHour = 0;
    if (!this.iSeeHour()){
                var Error = new (require('./Error.js'))();
                Error.emptyValueHour();
                return false;
    }
   return true;
}
Validator.prototype.parserValue = function (){
    if (!this.isNum(this.salaryGr) || !this.isNum(this.salaryZl) ){
        return false;
    }
    
    if (!this.isNum(this.dayHour) || !this.isNum(this.nightHour)){
        return false;
    }
    if (!this.isGoodLength(this.salaryGr) || !this.isGoodLength(this.salaryZl)){
         var Error = new (require('./Error.js'))();
         Error.tooLength();
         return false;
    }
    this.salaryGr = parseInt(this.salaryGr);
    this.salaryZl = parseInt(this.salaryZl);
    this.dayHour = parseInt(this.dayHour);
    this.nightHour = parseInt(this.nightHour);
    this.convertToFloat();
    return true;
}
Validator.prototype.checkCriteria = function (){
    var JSON = new (require('./JSON.js'))('JS/lib/modules/JSON/options.json');
    var getOptions = JSON.getOptions();
     getOptions.then(function( JSON ) {
             alert ("Its OK. I see" + this);
             return console.log(this.isCorrect(JSON));
             
             if (this.isCorrect(JSON)) return true;    return false;
            }.bind(this));
            
}

Validator.prototype.iSeeSalary  = function (){
      if (this.isEmpty(this.salaryZl) && this.isEmpty(this.salaryGr)){
     return false;
   } 
     if (this.isEmpty(this.salaryZl) && !this.isEmpty(this.salaryGr)){
     return false;
   } 
   return true;
}
Validator.prototype.iSeeHour = function (){
     if (this.isEmpty(this.dayHour) && this.isEmpty(this.nightHour)){
       return false;
   }
   return true; 
}
Validator.prototype.isNum = function (value){
    if (value < 0 ){
          var Error = new (require('./Error.js'))();
           Error.lessAsZero();
           return false;
    }
    if (isNaN(parseInt(value,10))){
          var Error = new (require('./Error.js'))();
          Error.isNotNumber();
          return false;
    }
    
    return true;
}
Validator.prototype.isCorrect = function (JSON){
    var inputHours = this.dayHour + this.nightHour;
    if (inputHours > parseInt(JSON.options[0].params)){
         var Error = new (require('./Error.js'))();
          Error.tooHours();
          return false;
    }
    
    if (this.salary < parseInt(JSON.options[1].params)){
        var Error = new (require('./Error.js'))();
          Error.lessSalary();
          return false;
    }
    if (this.salary > parseInt(JSON.options[2].params)){
            var Error = new (require('./Error.js'))();
          Error.highSalary();
          return false;
    }
    return true;
}
Validator.prototype.getState = function (){
    return this.state;
}
Validator.prototype.setState = function (value){
    this.state = value;
}
Validator.prototype.isEmpty = function (value){
    if (value == ""){
      
        return true;
    }
     return false;
}
Validator.prototype.isGoodLength = function (value){
   if (value.length > 2)return false; return true;
}
Validator.prototype.convertToFloat = function (value){
    var floatValue = this.salaryZl + "." + this.salaryGr;
    var StringValue = floatValue.toString();
    this.setSalary(parseFloat(StringValue));
}
Validator.prototype.setSalary = function (value){
    this.salary = value;
}
Validator.prototype.getSalary = function (){
    return this.salary;
}

Jak widzisz, w validatorze jest wykonywany request do servera, ale nie powinno to mieć wpływu na metodę inicjującą, tymbardziej że każe mu czekać na strumień zwrotny z init.

komentarz 26 lipca 2016 przez Comandeer Guru (601,510 p.)

Czy require jest asynchroniczne? Jeśli tk, to cały kod trzeba by przepisać uwzględniając ten fakt.

komentarz 27 lipca 2016 przez ShiroUmizake Nałogowiec (46,300 p.)
Module Json jest wywołany fetch. Pewnie musiałbym uwzględnić w module głównym i dosłać do konstruktora validatora? Hmm...zostawievto jako plan b.wpierw pomecze się z proxy.

Podobne pytania

0 głosów
2 odpowiedzi 468 wizyt
0 głosów
0 odpowiedzi 142 wizyt
pytanie zadane 12 września 2021 w Python przez MsMaciek123 Pasjonat (24,760 p.)
0 głosów
1 odpowiedź 296 wizyt

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...