0

这是我第一个涉及 Flash 中的外部类的项目,所以这可能是一个相当基本的问题:我正在尝试在 CSVloader 类中加载一个 csv 文件:

package Application {

import flash.events.Event;
import flash.display.Loader;
import flash.filesystem.File;
import flash.net.*;

import Application.*;

public class CSVloader {
    private var waiting = true;
    private var CSVdata:Array;
    private var myCsvLoader:URLLoader = new URLLoader;
    public function CSVloader() {

    }

    public function loadCSV(Args:String){

        myCsvLoader.dataFormat = URLLoaderDataFormat.TEXT;
        myCsvLoader.load(new URLRequest(Args));
        myCsvLoader.addEventListener(Event.COMPLETE, onWait);
        return CSVdata;
    }

    public function onCSVLoaderReady():Array {
            var CSVdata:Array;
            var str:String = myCsvLoader.data as String;

            CSVdata = str.split("\n");

            for (var i:int=0; i<CSVdata.length; i++) {
              CSVdata[i] = CSVdata[i].split(';');
            }

            for(var q:int = 0; q<(CSVdata.length-1);q++){
                CSVdata[q][1] = CSVdata[q][1].slice(0,-1);
            }

            trace("CSV loaded! : " + CSVdata);
            return CSVdata;
    }


    private function onWait(e:Event):void{
        CSVdata = onCSVLoaderReady();
    }

}

}

如何编写 CSVloader 类,以便在调用 CSVloader("some url") 时得到一个包含所有数据的数组?

这是我的 AppController 类:

package{
import Application.CSVloader;
import Application.C;

import flash.display.MovieClip;

public class AppController extends MovieClip{

    public function AppController() {
        // constructor code

    }

    public function init(){
        var myCSVLoader = new CSVloader();
        trace(myCSVLoader.loadCSV("data.csv"));
    }

}

}

4

1 回答 1

0

您不能像执行普通函数那样真正从事件侦听器返回数据,因为它们是异步调用的(它们不会立即被调用)。您需要做的是在 csv 数据准备好时从 CSVLoader 发送一个事件。

CSVLoader 需要扩展 EventDispatcher 以便它可以调度事件。将此添加到您的导入中:

import flash.events.EventDispatcher;

使 CSVLoader 扩展 EventDispatcher 并添加一个类属性来保存 csv 数据:

public class CSVLoader extends EventDispatcher {
    public var csvData = [];
    ...

onCSVDataReady(),不要创建一个新的数组来保存数据,使用你上面声明的属性。在 末尾onCSVDataReady(),删除您的 return 语句并添加:

dispatch(new Event(Event.COMPLETE));

不要忘记将方法声明中的返回类型更改为 void。您还应该删除您现在拥有的所有 return 语句,因为它们不会返回任何内容。

然后在 AppController 中执行以下操作:

private var myCSVLoader = new CSVLoader();

public function init(): void {
    myCSVLoader.addEventListener(Event.COMPLETE, completeListener);
    myCSVLoader.loadCSV("data.csv");
}

private function completeListener(evt: Event): void {
    trace(myCSVLoader.csvData);
}

理想情况下,您会将 CSVLoader 中的 csvData 设为私有,并创建一个 getter 方法来访问它,但为了简洁起见,我这样做了。

于 2013-10-30T15:12:55.147 回答