2011-02-27 32 views
1

我需要一種方法來等待運行parseCSV命令,直到readFile事件更新了importData的內容爲止。我已經看到了有關自定義事件調度程序的一些內容,但無法完全弄清楚如何在我的情況下使用它們。如何僅在已分配參數變量時才運行函數?

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(); 
    } 

回答

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); 
} 
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(); 
} 
+0

@Todorus ..我不想只從readfile調用它的原因是我希望importFile函數控制包括parsecsv後面的函數在內的函數流。 – Damon 2011-02-27 20:15:26

相關問題