我很确定我的问题有一个非常简单的解决方案,但无论如何我都会尽可能详细地解释。
基本上我使用带有MySQL的PHP使用GET将信息发送到我的闪存文件。
使用 FlashVars,我设法获取了用户的"id",我可以将我的问题/搜索发送到访问数据库并将信息返回到 html 页面的 PHP 脚本。
我现在想做的是将发送回 html 页面的信息添加到 flash 内部的变量中,例如:
var usr_name = get_user_name(id) || 'Unknown'; // "Unknown" should just be for offline use.
但这只返回"未知"
这是使用的函数:
public function get_user_name(usr_id){
loadData('search.php',"quest=name",'usr_id='+usr_id);
}
private function loadData(page_Name='search.php',get1='g1=1',get2='g2=2',get3='g3=3'):void {
var randomParam:String = "?p=" + Math.floor(Math.random() * (10000000));
var create_URL = (URL + page_Name + randomParam + '&'+ get1 + '&' + get2 + '&' + get3) ;
trace(create_URL);
_loader = new URLLoader();
_request = new URLRequest(create_URL);
_request.method = URLRequestMethod.POST;
_loader.addEventListener(Event.COMPLETE, onLoadData);
_loader.addEventListener(IOErrorEvent.IO_ERROR, onDataFiledToLoad);
_loader.addEventListener(IOErrorEvent.NETWORK_ERROR, onDataFiledToLoad);
_loader.addEventListener(IOErrorEvent.VERIFY_ERROR, onDataFiledToLoad);
_loader.addEventListener(IOErrorEvent.DISK_ERROR, onDataFiledToLoad);
_loader.load(_request);
}
public function onLoadData(e:Event):String {
return(e.target.data);
}
这一切似乎都很好,只是当我尝试不使用 or 语句时(||"未知")我收到此错误:
TypeError: Error #2007: Parameter text must be non-null.
at flash.text::TextField/set text()
at App/frame1()
如果我只是在网络浏览器中输入 URL,我会输出名称。
我不确定为什么这是一个这样的问题。
谢谢伊
public function onLoadData(e:Event):String {
return(e.target.data);
}
如果你期望上面的函数将响应字符串返回到变量中,那么你就错了。
你必须让onLoadData
填充变量本身。试试这样一种方式:
var usr_name = 'Unknown';
get_user_name(id);
function get_user_name(usr_id) {
loadData('search.php',"quest=name",'usr_id='+usr_id);
}
function loadData(page_Name='search.php',get1='g1=1',get2='g2=2',get3='g3=3'):void {
var randomParam:String = "?p=" + Math.floor(Math.random() * (10000000));
var create_URL = (URL + page_Name + randomParam + '&'+ get1 + '&' + get2 + '&' + get3);
trace(create_URL);
_loader = new URLLoader();
_request = new URLRequest(create_URL);
_request.method = URLRequestMethod.POST;
_loader.addEventListener(Event.COMPLETE, onLoadData);
_loader.addEventListener(IOErrorEvent.IO_ERROR, onDataFiledToLoad);
_loader.addEventListener(IOErrorEvent.NETWORK_ERROR, onDataFiledToLoad);
_loader.addEventListener(IOErrorEvent.VERIFY_ERROR, onDataFiledToLoad);
_loader.addEventListener(IOErrorEvent.DISK_ERROR, onDataFiledToLoad);
_loader.load(_request);
}
function onLoadData(e:Event) {
usr_name = e.target.data;
}
好的,粗略地看一下您的代码,很明显您不知道 AS3 中 URL 请求的"异步"性质。
当你做_loader.load()
时,Flash实际上在不同的线程上打开这个管道,可以这么说。这可确保应用程序在加载 URL 请求时不会冻结。
您所需要的只是这样的东西:
public function get_user_name(usr_id){
loadData('search.php',"quest=name",'usr_id='+usr_id);
}
private function loadData(page_Name='search.php',get1='g1=1',get2='g2=2',get3='g3=3'):void {
var randomParam:String = "?p=" + Math.floor(Math.random() * (10000000));
var create_URL = (URL + page_Name + randomParam + '&'+ get1 + '&' + get2 + '&' + get3) ;
trace(create_URL);
_loader = new URLLoader();
_request = new URLRequest(create_URL);
_request.method = URLRequestMethod.POST;
_loader.addEventListener(Event.COMPLETE, onLoadData);
_loader.addEventListener(IOErrorEvent.IO_ERROR, onDataFiledToLoad);
_loader.addEventListener(IOErrorEvent.NETWORK_ERROR, onDataFiledToLoad);
_loader.addEventListener(IOErrorEvent.VERIFY_ERROR, onDataFiledToLoad);
_loader.addEventListener(IOErrorEvent.DISK_ERROR, onDataFiledToLoad);
_loader.load(_request);
}
public function onLoadData(e:Event):String {
usr_name = e.target.data || 'Unknown';
}
你称它为像
var usr_name = "";
get_user_name();
我注意到您的代码不是强类型,即您没有为变量分配数据类型。这可能会导致问题,也会降低可读性。
此外,您最好删除您添加的所有事件侦听器(使用 removeEventListener
),以便加载器被垃圾回收。