【问题标题】:AS3 - I can't get a string value returned from a functionAS3 - 我无法获得从函数返回的字符串值
【发布时间】:2023-04-10 02:48:01
【问题描述】:

AS3 代码,从示例中,我希望字符串“位置”中的值可用于主程序的其他部分。它在完成的处理程序中返回正常,但我如何使其可用于第一部分?

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.");
}


    }

}

【问题讨论】:

  • 你的完整处理程序正确执行了吗??

标签: actionscript-3 return tinyurl


【解决方案1】:
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保存你的字符串值,你可以得到这个字符串值 课堂内外的任何地方。

【讨论】:

  • 我不明白引入静态位置如何解决问题。更糟糕的是 - 现在您有两个用于相同目的的变量。
  • Stefan,我认为那是为了成为变量的“句柄”。这就是 OP 要求得到的,尽管这是绝对可怕的做法 misko.hevery.com/code-reviewers-guide/…
【解决方案2】:

构造函数中的跟踪语句不起作用,因为该跟踪发生在发出数据请求之后、下载数据和设置 位置 之前。构造函数用于设置对象的初始条件。使数据请求的结果立即可供构造函数使用的唯一方法是直接将其传入,但我认为这会破坏类的意义。

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

【讨论】:

    【解决方案3】:

    经过测试并且可以正常工作!

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

    收到 URL 后,您可以通过 trace(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.");
        }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-18
      • 2016-06-30
      • 2019-01-31
      • 2020-10-28
      • 1970-01-01
      • 2016-12-17
      • 2016-08-26
      • 1970-01-01
      相关资源
      最近更新 更多