2017-03-26 1 views
0

나는 자바 스크립트로 코드하는 법을 배웁니다. 나는 항상 오류가 있습니다 : "정의되지 않은 속성 'filter'를 읽을 수 없습니다. 내가 왜 여기서 잘못하고 왜?배열에 필터 함수를 사용할 수 없습니다

A 클래스의 옵저버가 될 싱글 톤 패턴과 B 클래스로 A 클래스를 빌드해야합니다. B 클래스의 인스턴스를 구독자 (옵저버)로 A 클래스에 추가하고 A 클래스의 임의 값 I가 B 클래스의 임의 값 P보다 큰 경우이를 구독 취소해야합니다.

var A = (function() 
{ 

    // Instance stores a reference to the Singleton 
    var instance; 

    function init() { 

// Singleton 


var i = 0; 
let observers = new Array(); 
function CheckIfGreaterThanI(observer) 
    { 
     console.log("CHECKING"); 
     return observer.getP() > this.getI(); 
    } 

return { 

    subscribe: function(observer) 
    { 
     console.log("DODAJĘ"); 
     observers.push(observer); 
    }, 

    unsubscribe: function(observerss) 
    { 
     console.log("USUWAM"); 
     for(i=0;i<observerss.length;i++) 
     { 
      var index = this.observers.indexOf(observerss[i]) 

      if (~index) 
      { 
       this.observers.splice(index, 1); 
      } 
     } 

    }, 

    notify: function() 
    { 
     for(let observer of observers) 
     { 
      observer.update(); 
     } 
    }, 

    getI: function() 
    { 
     return this.i; 
    }, 

    setI: function(value) 
    { 
     this.i = value; 
     this.notify(); 


///THAT'S THE PLACE WHERE ERROR RISES 
     var observersToUnsubscribe = this.observers.filter(this.CheckIfGreaterThanI); 
     this.unsubscribe(observersToUnsubscribe); 

    } 
}; 

}; 

return 
{ 

// Get the Singleton instance if one exists 
// or create one if it doesn't 
getInstance: function() { 

    if (!instance) { 
    instance = init(); 
    } 

    return instance; 
} 

}; 

})(); 

function B (name,value,a) //observer 
{ 
    this.Name = name; 
    this.P = value; 
    this.A = a;  
} 

B.prototype = 
{ 
    constructor:B, 
    getName : function() 
    { 
     return this.Name; 
    }, 


    getP : function() 
    { 
     return this.P; 
    }, 

    update : function() 
    { 
     if(A.getInstance().getI()<this.P) 
     { 
      console.log("OK - " + this.Name); 
     } 
    } 
}; 

for(i=0;i<10;i++) 
{ 
    var bObject = new B(i,Math.random(),A.getInstance()); 
    A.getInstance().subscribe(bObject); 
} 

var ChangeIValue = function() 
{ 
    A.getInstance().setI(Math.random()); 
} 


setTimeout(function run() 
{ 
    ChangeIValue(); 
    setTimeout(run,1000); 
} 
, 1000); 
+0

모든 것이 여기에있다. 필터 제외. –

+0

@SagarV "setI"방법에 있음 – Terrykk

+0

'this.observers'가 어디에 정의되어 있다고 생각합니까? 그 속성은'this'의 어느 곳에서도 생성되지 않습니다. – Bergi

답변

0

OK, 나는 혼자이 문제를 해결하고 그 뒤에 많은 실수가 있었다, 그래서 나는 내 용액을 첨가 :

var A = (function() 
{ 

    // Instance stores a reference to the Singleton 
    var instance; 

    function init() { 

    // Singleton 


    var i = 0; 
    var observers =[]; 
    function CheckIfGreaterThanI(observer) 
    { 
     return observer.getP() > i; 
    } 

    return { 

    subscribe: function(observer) 
    { 
     observers.push(observer); 
    }, 

    unsubscribe: function(observersToUnsubscribe) 
    { 

     for(let observer of observersToUnsubscribe) 
     { 
      var index = observers.indexOf(observer); 
      if(index!=-1) 
      { 
       observers.splice(index,1); 
      } 
     } 
    }, 

    notify: function() 
    { 
     for(let observer of observers) 
     { 
      observer.update(); 
     } 
    }, 

    getI: function() 
    { 
     return i; 
    }, 




    setI: function(value) 
    { 
     i = value; 
     this.notify(); 


    var observersToUnsubscribe = observers.filter(CheckIfGreaterThanI); 
    this.unsubscribe(observersToUnsubscribe); 

    return; 

    } 
}; 

}; 

return { 

// Get the Singleton instance if one exists 
// or create one if it doesn't 
getInstance: function() 
{ 
    if (!instance) 
    { 
    instance = init(); 
    } 
    return instance; 
} 

}; 

})(); 

function B (name,value,a) //observer 
{ 
    this.Name = name; 
    this.P = value; 
    this.A = a;  


    this.getName = function() 
    { 
     return this.Name; 
    }; 


    this.getP = function() 
    { 
     return this.P; 
    }; 

    this.update = function() 
    { 
     if(A.getInstance().getI()<this.P) 
     { 
      console.log("OK - " + this.Name); 
     } 
    }; 
}; 

for(j=0;j<10;j++) 
{ 
    var bObject = new B(j,Math.random(),A.getInstance()); 
    A.getInstance().subscribe(bObject); 
} 

var ChangeIValue = function() 
{ 
    A.getInstance().setI(Math.random()); 
} 


setTimeout(function run() 
{ 
    ChangeIValue(); 
    setTimeout(run,1000); 
} 
, 1000); 
관련 문제