我试图让我的函数在加载后从php脚本返回一个值。我遇到了'返回'方面的问题。从一个带有'return'的函数中尝试'TheLink'的值。它通常是null。我在这里做错了什么?
var theLink = loadAudio();
public function loadAudio():String
{
var req:URLRequest = new URLRequest("myScript.php");
var loader:URLLoader = new URLLoader(req);
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE, Finished);
function Finished(e:Event)
{
var theValue = JSON.parse(e.target.data.audioLink);
return theValue;
}
}
答案 0 :(得分:3)
您的代码中存在许多错误,但更重要的是您无法摆脱AS3的异步性质。
首先,即使AS3不是异步的,您的代码仍然无效。 “loadAudio”永远不会返回任何内容,因此Link永远无法获取任何数据。 'Finished'方法是返回的东西,但是没有变量可以捕获那些数据。
现在真实的东西,AS3是异步的,这意味着事情会在以后发生,这就是为什么你需要传递一个事件监听器,以便在事情发生时“捕获”。在你的情况下,Event.COMPLETE将在稍后的时间触发(异步),因此在结果实际可用之前,变量无法捕获结果:
var theLink:Object = loadAudio();//this is not possible
正确的方法是:
private var loader:URLLoader;//avoid GC
private var theLink:Object;//this will store result when available
//I assume you are using a class
public function MyClass()
{
loadAudio();//let's start loading stuff
}
private function loadAudio():void
{
var req:URLRequest = new URLRequest("myScript.php");
loader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE, handleLoaded);
loader.load(req);
}
private function handleLoaded(e:Event):void
{
theLink = JSON.parse(e.target.data.audioLink);
//done loading so store results.
}