2017-03-26 20 views
0

JavaScriptでコードする方法を学びます。私はいつもエラーがある: "未定義のプロパティ 'フィルタ'を読むことができません。私はここで間違って何をしているのですか?は配列のフィルタ関数を使用できません

AクラスのオブザーバになるシングルトンパターンとBクラスを持つAクラスをビルドする必要があります。 Aクラスのランダムな値IがBクラスのランダムな値Pより大きい場合、Bクラスのインスタンスをサブスクライバ(オブザーバ)としてAに追加し、それを解除する必要があります。

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); 
関連する問題