as3 return 加载程序完成时的值

as3 return value on loader complete

我试图让我的函数在加载后从 php 脚本中 return 获取一个值。我在 'return' 方面遇到问题。尝试从其中包含 'return' 的函数中获取“TheLink”的值。它通常为空。我在这里做错了什么?

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

您的代码中有很多错误,但更重要的是您无法摆脱 AS3 的异步特性。

首先,即使 AS3 不是异步的,您的代码仍然无法运行。 "loadAudio" 从不 return 任何东西,因此 theLink 永远无法获取任何数据。 'Finished' 方法是一个 return 方法,但也没有变量来捕获该数据。

现在真正的东西,AS3 是异步的,这意味着事情会在稍后发生,这就是为什么你需要传递一个事件侦听器以便 'catch' 当事情发生时。在您的情况下,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.   
}