AS3 - я не могу получить строковое значение, возвращаемое функцией - PullRequest
0 голосов
/ 19 декабря 2011

AS3-код из примера, я хочу, чтобы значение в строке 'location' было доступно для других частей основной программы. Он возвращается нормально в завершенном обработчике, но как мне сделать его доступным для первой части?

package  {

import flash.display.MovieClip;
import flash.display.MovieClip;
import flash.events.*
import flash.net.*;
import flash.net.URLVariables;  

public class turl extends MovieClip {

public var location:String = new String();

public function turl() {
    // constructor code 
var variables:URLVariables = new URLVariables();
variables.url = String("xxxxxxxxx");
sendAndLoad("xxxxxxxx", variables)
// THIS TRACE WILL NOT DISPLAY THE LOCATION _ A TINY URL
trace("TinyURL: " + location);
    }

function sendAndLoad(url:String, _vars:URLVariables ):void {

var request:URLRequest = new URLRequest(url);
var _urlloader:URLLoader = new URLLoader();
_urlloader.dataFormat = URLLoaderDataFormat.TEXT;
request.data = _vars;
request.method = URLRequestMethod.POST;
_urlloader.addEventListener(Event.COMPLETE, handleComplete);
_urlloader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
_urlloader.load(request);


}
function handleComplete(event:Event):void {
    var loader:URLLoader = URLLoader(event.target);
    location = loader.data;
    trace("TinyURL: " +  location);

}
function onIOError(event:IOErrorEvent):void {
    trace("Error loading URL.");
}


    }

}

Ответы [ 3 ]

1 голос
/ 19 декабря 2011
package 
{
  import flash.display.MovieClip;
  import flash.display.MovieClip;
  import flash.events.*
  import flash.net.*;
  import flash.net.URLVariables;  

  public class turl extends MovieClip 
  {
    public static var Location:String;

    public function turl() {
     // constructor code 
     var variables:URLVariables = new URLVariables();
     variables.url = String("http://www.designscripting.com");
     sendAndLoad("http://tinyurl.com/api-create.php", variables)
     // THIS TRACE WILL NOT DISPLAY THE LOCATION _ A TINY URL
     trace("TinyURL: " + Location);
  }

  function sendAndLoad(url:String, _vars:URLVariables ):void
  {
     var request:URLRequest = new URLRequest(url);
     var _urlloader:URLLoader = new URLLoader();
     _urlloader.dataFormat = URLLoaderDataFormat.TEXT;
      request.data = _vars;
      request.method = URLRequestMethod.POST;
     _urlloader.addEventListener(Event.COMPLETE, handleComplete);
     _urlloader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
     _urlloader.load(request);
   }

   function handleComplete(event:Event):void {
   var loader:URLLoader = URLLoader(event.target);
   Location= loader.data;
   trace("TinyURLss: " +  Location);
   }

   function onIOError(event:IOErrorEvent):void {
   trace("Error loading URL.");
   }
}
}

статическая переменная Местоположение содержит ваше строковое значение, и вы можете получить это строковое значение в любом месте в классе и за его пределами.

0 голосов
/ 19 декабря 2011

Протестировано и работает!

var turl: Turl = new Turl ("http://www.designscripting.com");

После получения URL вы можете получить к нему доступ по трассировке (turl.loc);

   package  {

    import flash.display.MovieClip;
    import flash.events.*
    import flash.net.*;
    import flash.net.URLVariables;  

    public class Turl extends MovieClip {

    public var loc:String;

    public function Turl(urlToEncode:String):void {

    var variables:URLVariables = new URLVariables();
    variables.url = String(urlToEncode);
    sendAndLoad("http://tinyurl.com/api-create.php", variables);

    }


//2. send the request for the URL

    private function sendAndLoad(url:String, _vars:URLVariables ):void {

    var request:URLRequest = new URLRequest(url);
    request.data = _vars;
    request.method = URLRequestMethod.POST;

    var _urlloader:URLLoader = new URLLoader(request);
    _urlloader.dataFormat = URLLoaderDataFormat.TEXT;

    _urlloader.addEventListener(Event.COMPLETE, handleComplete, false, 0, true);
    _urlloader.addEventListener(IOErrorEvent.IO_ERROR, onIOError, false, 0, true);
    _urlloader.load(request);

    }


//3. handle the response. Only accessible once the response has been received.

    private function handleComplete(event:Event):void {

    event.target.removeEventListener(Event.COMPLETE, handleComplete);
    event.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);

    loc = event.target.data;
    trace("loc = "+event.target.data);

    }

    function onIOError(event:IOErrorEvent):void {
    event.target.removeEventListener(Event.COMPLETE, handleComplete);
    event.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
    trace("Error loading URL.");
    }
}
}
0 голосов
/ 19 декабря 2011

Оператор трассировки в конструкторе не работает, поскольку эта трассировка происходит сразу после выполнения запроса данных, до загрузки данных и установки location .Конструктор предназначен для установки начальных условий объекта.Единственный способ сделать результат запроса данных немедленно доступным для конструктора - это передать его напрямую, но я думаю, что это победит точку класса.

public function TURL(value:String)
{
    location = value;

    // Now this will work like you think.
    trace("TinyURL: " + location);
}

Я предполагаю, что у вас естьдругие объекты, использующие этот класс TURL , имеют правильное местоположение.В этом случае класс TURL отправляет событие, когда он устанавливает переменную location , указывая, что он готов к использованию.

function handleComplete(event:Event):void
{
    var loader:URLLoader = URLLoader(event.target);        
    location = loader.data;

    dispatchEvent(new Event(Event.COMPLETE));
}
...