0

首先:英语不是我的第一语言。;-)

我正在编译以下代码:

var sqldata:String;
function sql(saveorload,sqlstring) {
    var sqlloader = new URLLoader();
    var sqlrequest = new URLRequest("http://***/sql.php");
    sqlrequest.method = URLRequestMethod.POST;
    sqlloader.addEventListener(Event.COMPLETE, sqldonetrace);

    var variables:URLVariables = new URLVariables();
    variables.sqlm = saveorload;
    variables.sqlq = sqlstring;
    sqlrequest.data = variables;

    sqlloader.load(sqlrequest);
}
function sqldonetrace(e:Event) {
    sqldata = e.target.data;
}
sql("1","SELECT * FROM songs WHERE `flag2` LIKE '0'");
trace (sqldata);

所以,问题来了:“sqldata”被跟踪为“null”。AS3 似乎运行“sql”,然后是“trace”,然后是“sqldone”,但我需要 sql -> sqldone -> trace...我不能将 trace-command 放在 sqldone-function 中,因为它已存储作为 *.as 并在我的 .swf 中的不同点加载,并不总是后跟一个跟踪命令。

脚本中有任何想法/提示/缺陷吗?

4

1 回答 1

0

Actionscript 在设计上是一种事件驱动的语言。它还保证代码在单个线程中执行,即如果函数调用开始,则在第一次调用完成之前不会执行其他(新调用)动作脚本代码。

话虽如此,您应该将完整的处理程序传递给 sql(...)。

function sql(saveorload:String, sqlstring:String, completeHandler:Function):void
{
    var sqlloader = new URLLoader();
    var sqlrequest = new URLRequest("http://***/sql.php");
    sqlrequest.method = URLRequestMethod.POST;
    sqlloader.addEventListener(Event.COMPLETE, completeHandler);//tell urlloader to use the complete handler passed in parameters    
    var variables:URLVariables = new URLVariables();
    variables.sqlm = saveorload;
    variables.sqlq = sqlstring;
    sqlrequest.data = variables;

    sqlloader.load(sqlrequest);
}

然后从其他地方使用它,例如:

sql("1","SELECT * FROM songs WHERE `flag2` LIKE '0'", sqldonetrace);
function sqldonetrace(e:Event)
{
    var sqldata:String = e.target.data;
    trace (sqldata);
}

另外,我认为您应该检查来自 urlloader 的错误事件。将另一个参数作为 errorHandler 传递给 sql

于 2013-04-22T18:42:38.930 回答