イナヅマTVログ

[JavaScript]オレオレ ライブラリのdispatchEventがエラーを吐くぜ

| 0件のコメント

CleateJS(EaselJS)のEventDispatcherを参考に自前ライブラリを作りました。

*CleateJS(EaselJS)での話ではありません。
オレオレライブラリの話です。

複数(3~5)のdispatchEventがほぼ同時に実行されています。
複数のtimer内で非同期にdispatchEventされているので「ほぼ同時」と書きました。

CreateJS(EaselJS)のEventDispatcherのdispatchEventを少し変更しています。

dispatchEvent = function(eventObj, params) {
    var ret = false;
    var listeners = this._listeners;
    if (eventObj && listeners) {
        if (typeof eventObj == "string") { eventObj = {type:eventObj, params:params}; }
        //eventObj.target = this;
        var arr = listeners[eventObj.type];
        if (!arr) { return ret; }
        for (var i=0,l=arr.length; i<l; i++) {
            var o = arr[i];
 
            // ここでエラー。f.oが存在しない
            ret = ret||o.f.apply(o.scope, [eventObj]);
        }
    }
    return !!ret;
};//dispatchEvent

Breakpointを設定してエラーチェックするけどエラー時にも"f""f.o"も存在するようにしか見えない…
エラー発生時とDeveloper Toolsで見るのに時間差があるからかも。
ほとんどエラーにならないんだけどなー

dispatchEvent = function(eventObj, params) {
    var ret = false;
    var listeners = this._listeners;
    if (eventObj && listeners) {
        if (typeof eventObj == "string") { eventObj = {type:eventObj, params:params}; }
        //eventObj.target = this;
        var arr = listeners[eventObj.type];
        if (!arr) { return ret; }
        for (var i=0,l=arr.length; i<l; i++) {
            var o = arr[i];
            // if 判定でエラー回避			
            if (o && o.hasOwnProperty("f")) {
	        ret = ret||o.f.apply(o.scope, [eventObj]);
            }
        }
    }
    return !!ret;
};//dispatchEvent

う〜ん、どっかのaddEventListenerで追加している関数がまずいんかなぁ〜
dispatchEventのfor iで毎回if判定するのは気が引ける。
addEventListenerをごにょごにょする方が良いかな…

MDN: hasOwnProperty

コメントを残す

必須欄は * がついています