AS3 - я не могу получить строковое значение, возвращаемое функцией
Код 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 ответа
Оператор трассировки в конструкторе не работает, потому что эта трассировка происходит сразу после запроса данных, до того, как данные были загружены и местоположение было задано. Конструктор предназначен для установки начальных условий объекта. Единственный способ сделать результат запроса данных немедленно доступным для конструктора - это передать его напрямую, но я думаю, что это нарушит точку зрения класса.
public function TURL(value:String)
{
location = value;
// Now this will work like you think.
trace("TinyURL: " + location);
}
Я предполагаю, что у вас есть другие объекты, которые полагаются на класс TURL, имеющий правильное местоположение. В этом случае класс TURL отправляет событие, когда устанавливает переменную местоположения, указывая, что он готов к использованию.
function handleComplete(event:Event):void
{
var loader:URLLoader = URLLoader(event.target);
location = loader.data;
dispatchEvent(new Event(Event.COMPLETE));
}
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.");
}
}
}
статическая переменная Location содержит ваше значение String, и вы можете получить это значение String в любом месте класса и за его пределами.
Проверено и работает!
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.");
}
}
}