1

readFileイベントがimportDataのコンテンツを更新するまで、parseCSVコマンドの実行を待つ方法が必要です。カスタムイベントディスパッチャについていくつか見てきましたが、自分の状況でそれらを使用する方法を完全に理解することはできません。

private var importData : String;

    public function importFile(event:MouseEvent):void {
        var data:String = chooseFile();
        parseCSV(importData);
    }

    public function chooseFile ():String {
        var filetype:FileFilter = new FileFilter("CSV Files(*.csv)","*.csv");
        var file:File = File.userDirectory;
        file.browseForOpen("Select CSV file to import", [filetype]);
        file.addEventListener(Event.SELECT, readFile);
        return importData;
    }

public function readFile (event:Event):void {
        var filestream:FileStream = new FileStream();
        filestream.open(event.target as File, FileMode.READ);
        importData = filestream.readUTFBytes(filestream.bytesAvailable);
        filestream.close();
    }
4

2 に答える 2

2

いくつかのコールバックを追加するか、いくつかのイベント リスナーを追加する必要があります。私はコールバックを好みます:

function importFile(...) {
     choseFile(function(file:File) {
         readFile(file, parseCSV);
     });
}

function choseFile(callback:Function) {
    ...
    file.addEventListener(Event.SELECT, function(event:Event) {
        callback(File(event.target));
    });
}

function readFile(file:File, callback:Function) {
    var data = ... read data from file ....;
    callback(data);
}
于 2011-02-27T04:47:56.403 に答える
2

readFile 関数に行を追加するだけではどうですか?

public function readFile (event:Event):void {
    var filestream:FileStream = new FileStream();
    filestream.open(event.target as File, FileMode.READ);
    importData = filestream.readUTFBytes(filestream.bytesAvailable);
    parseCSV(importData);
    filestream.close();
}

コマンドは importData が設定されるとすぐに実行されます。

カスタム イベント ルートが必要な場合は、独自のカスタム イベントをディスパッチする必要があります。各イベントには、それを識別する単なる文字列である型パラメーターがあります。たとえば、Event.CHANGE は「change」を使用するのと同じです。

static public const CUSTOM = "myCustomEvent";

public function someConstructor():void {
    addEventListener(CUSTOM, onCustomEvent);
}

public function testDispatch():void{
    dispatchEvent(new Event(CUSTOM));
}

private function onCustomEvent(e:Event):void{
    trace("custom event Dispatched");
}

したがって、このようなことを試すことができます。

public function importFile(event:MouseEvent):void {
        addEventListener(CUSTOM, onImport);
        var data:String = chooseFile();
    }

private function onImport(e:Event):void {
    parseCSV(importData);
}

public function readFile (event:Event):void {
    var filestream:FileStream = new FileStream();
    filestream.open(event.target as File, FileMode.READ);
    importData = filestream.readUTFBytes(filestream.bytesAvailable);
    dispatchEvent(new Event(CUSTOM));
    filestream.close();
}
于 2011-02-27T13:33:03.687 に答える