2007/01/04
has no properties ?
FlashMediaServer2.0.3(以下、FMS)を利用したときに困ったことのメモ。
FMSへのコネクション数(同時1000とか)が多くなると、頻繁にオブジェクトの参照が出来なくなることがありました。
オブジェクトは存在するけど中身を参照できない。参照するとundefinedが返ってきます。
こいつは困った問題です。
参照するコードの一行前で確実に値を代入していたとしても、
次の行で参照するとundefinedとなり、値が格納されていることを前提に処理を記述しているとエラーが発生します。
1行目で参照できる。
2行目で参照できない。
3行目で参照できる。なんてこともあります。
3行目で参照できたのに2行目で参照できない原因がわかりません。
たとえば以下のようなスクリプトの場合
001:// 前提条件:ユーザ制御クラスのインスタンスが生成されていること
002:// userManager = new UserManager();
003:
004:// スーパークラスを参照する
005:Client.prototype;
006:/**
007: * ユーザを追加する
008: *
009: */
010:pt.addUser = function( userID, userName ):Void{
011: userManager.addUser( userID, userName );
012:}
013:/**
014: * ユーザを取得する
015: *
016: */
017:pt.getUser = function( userID ):Void{
018: var user = userManager.getUser( userID );
019: trace( "ユーザ名:" + user["name"] );
020:}
021:/**
022: * ユーザを削除する
023: *
024: */
025:pt.removeUser = function( userID ):Void{
026: userManager.removeUser( userID );
027:}
028:// 参照を破棄する
029:delete pt;
001:/**
002: * ユーザ制御クラス
003: *
004: */
005:UserManager = function(){
006: this.init();
007:}
008:// スーパークラスを参照する
009:pt = UserManager.prototype;
010:/**
011: * 初期化する
012: *
013: */
014:pt.init = function(){
015: // ユーザ情報を管理するオブジェクトを生成する
016: this.userList = new Object();
017:}
018:/**
019: * ユーザを追加する
020: *
021: */
022:pt.addUser = function( userID, userName ){
023: // ユーザIDをキーにしてユーザ名を格納
024: this.userList[ userID ] = new Object();
025: this.userList[ userID ]["name"] = userName;
026:}
027:/**
028: * ユーザを取得する
029: *
030: */
031:pt.getUser = function( userID ){
032: return this.userList[ userID ];
033:}
034:/**
035: * ユーザを削除する
036: *
037: */
038:pt.removeUser = function( userID ){
039: delete this.userList[ userID ];
040:}
041:// 参照を破棄する
042:delete pt;
Clientの19行目とUserManagerの25行目、32行目、39行目でエラーが発生する可能性があります。
オブジェクトにアクセスする箇所は全てif文で囲むだけで解決する簡単なことなのですが、
UserManagerの25行目でエラーが発生したとしても1行前で初期化を行っているので原因がわかりません。
TypeError: userList[userID]["name"] has no properties
ログには、そんなプロパティは存在しないと出力されているだけです。
FMSでオブジェクトにアクセスするときは必ずif文で囲みましょうということなのでしょうか?
034:/**
035: * ユーザを削除する
036: *
037: */
038:pt.removeUser = function( userID ){
039: if( userID != undefined ){
040: delete this.userList[ userID ];
041: }
042:}
解説しているサイトがありましたらお知らせくださいませ。
コメント一覧