2
private var csv:URLLoader = new URLLoader();
private var array:Array = new Array();
private var urlr:URLRequest = new URLRequest();
public function loadRecipe(path:String):void
{
    try
    {
        csv.dataFormat = URLLoaderDataFormat.TEXT;
        urlr = new URLRequest(path);
        csv.addEventListener(Event.COMPLETE, finishRecipe);     
        csv.load(urlr);
    }
    catch (e:SecurityErrorEvent)
    {
        trace("1");
    }
    catch (e:IOErrorEvent)
    {
        trace("2");
    }
}

public function finishRecipe(e:Event):void
{
    var csvString:String = csv.data as String;
    array = csvString.split(",");
}

私が使用しているコードは上記のとおりです。完了イベントをトリガーすることができません。つまり、配列に値が入力されません。理由について誰かが私に洞察を与えることができますか?

編集:すべての弱い参照を取り除き、エラーをチェックするように変更しました。エラーは発生しません。

4

2 に答える 2

2

私は何年にもわたってこのバグに頻繁に遭遇しました。特定のブラウザ (FireFox、Chrome) がネットワークではなくキャッシュからファイルを取得すると、ローダーは PROGRESS イベントを送出しますが、COMPLETE にはなりません。

ブラウザのキャッシュをクリアして、次回ファイルが正しく読み込まれるかどうかを確認してください。その場合、回避策として次の 2 つのいずれかを行うことができます。

  1. リクエスト URL の末尾にランダムな文字列を追加して、キャッシュを解除します。

    urlr = new URLRequest(path + "?cachebust=" + Math.floor(100000+900000*Math.random()));
    

    これはコーディングが簡単ですが、明らかな欠点があり、不要なリロードを強制します。

  2. COMPLETE イベントと PROGRESS イベントの両方をリッスンします。PROGRESS ハンドラーで、bytesLoaded が bytesTotal と一致するかどうかを確認します。存在する場合は、すべてのハンドラーを削除し、COMPLETE イベントであるかのように続行します。

    ... somewhere in your code ...
        loader.addEventListener(Event.COMPLETE, handleComplete);
        loader.addEventListener(ProgressEvent.PROGRESS, handleProgress);
    
    ... somewhere else
    private function handleProgress(evt:ProgressEvent):void
    {
        checkLoadComplete();
    }
    private function handleComplete(evt:Event):void
    {
        checkLoadComplete();
    }
    private function checkLoadComplete():void
    {
        if(loader.bytesTotal > 0 && loader.bytesLoaded == loader.bytesTotal) {
            loader.removeEventListener(Event.COMPLETE, handleComplete);
            loader.removeEventListener(ProgressEvent.PROGRESS, handleProgress);
    
            ... your code here
        }
    }
    
于 2014-04-24T03:27:59.297 に答える
0

うーん、あなたが提供したコードを見るだけで、実際に try/catch を使用してエラーをキャッチしようとしているようです。エラーを見つけるには、実際のローダーでエラーを聞き始める必要があります。このような:

public function Foobar() {
    var loader:URLLoader;
    loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
    loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
    loader.addEventListener(ProgressEvent.PROGRESS, onProgress);
    loader.addEventListener(Event.COMPLETE, onComplete);
}

private function onComplete(e:Event):void {}
private function onProgress(e:ProgressEvent):void {}
private function onSecurityError(e:SecurityErrorEvent):void {}
private function onIOError(e:IOErrorEvent):void {}
于 2013-01-18T19:45:08.393 に答える