as3返回值加载完成

时间:2016-01-05 13:03:22

标签: function actionscript-3 urlloader

我试图让我的函数在加载后从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;
      }                     
   }

1 个答案:

答案 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.   
}