从Actionscript调用的Red5服务参数的奇怪行为

时间:2013-05-15 02:41:22

标签: actionscript-3 red5

我有一个Red5服务函数,它接收一个字符串作为参数,另一个函数不带参数,如下面的代码:

public class AService
{
   private String someName;

   public void setName(String aName)
   {
       someName = aName;
   }
   .
   .
   public String makeMessage()
   {
       return("Hello, "+someName);
   }
   .
   .
   other functions
}

我还有一个ActionScript函数,它使用动态参数调用服务函数:

public class Connector
{
   private var netConn: NetConnection;

   public function invokeCall(theFunc:String,...theParams): void
   {
      var resp:Responder = new Responder(checkResult);
      netConn.call(theFunc,resp,theParams);
   }
   .
   .
}

我知道“...... theParams”实际上是一个参数对象数组。我也知道NetConnector类的call()方法使用该参数对象数组。不幸的是,当我在我的服务的makeMessage()方法上执行invokeCall()时(没有输入参数),如下所示:

invokeCall("AService.makeMethod");

我从Red5获得一个函数不存在的消息。我可以使其工作的唯一方法是创建两个调用方法,一个带参数,一个没有,并调用没有参数的函数。

此外,调用我的setName()函数,如下所示:

invokeCallwithPrams("AService.setName","factor3");
除非我更改服务功能的签名,否则

似乎不起作用:

public class AService
{
   private String someName;

   public void setName(String[] aName)
   {
       someName = aName[0];
   }
   .
   .
   public String makeMessage()
   {
       return("Hello, "+someName);
   }
   .
   .
   other functions
}

我不介意(尽管Red5文档表明我不应该将参数视为数组),除非我将字符串“factor3”传递给NetConnection类的call()方法不知怎的,它在setName()中变成了“[factor3]”!

显然,这里有些麻烦,但我无法弄明白。

我正在使用Red5版本1.0.1,我的Actionscript是版本3。

任何人都可以向我解释发生了什么,(更重要的是)如何解决这个问题???

如果是,请告知......

更新:奇怪的事情继续

我做了一个测试,我在其中更改了我用来设置的函数的参数,并调用了NetConnection类的call()方法。而不是传递它“... theParams”,我把它改为theParams:String,就像这样:

   public function invokeCall(theFunc:String,theParams:String): void
   {
      var resp:Responder = new Responder(checkResult);
      netConn.call(theFunc,resp,theParams);
   }

有趣的是,我的服务方法setName()中出现的括号消失了!

无论这个问题是什么,它都与Actionscript中的动态参数有关。我怀疑我在Actionscript 3中发现了一个错误,它不允许它正确处理从另一个方法传递给方法的动态参数。

有没有人见过这个问题?有什么解决方案吗?动态参数应该允许任何人根据需要添加参数并使它们成为必要的任何对象。不幸的是,看起来你不能使用从另一种方法传递的动态参数而不会搞砸它们。

这看起来像是Actionscript中的一个严重错误。我是对的吗?

有人请指教......

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。它不是Actionscript中的错误,它在语言中有点奇怪。

有关解决方案的基本信息,请访问:

AS3 variable length argument expand to call another function with var length args

基于什么,我需要在我用于invokeCallwithParams的方法中执行以下操作:

.
.
var conn:Connector = new Connector();

private function invokeCaller(fName:String,...cParams)
{
   cParams.unshift(fName);
   conn.invokeCall.apply(conn,cParams);
}

这消除了传递给我的setName()服务函数的不必要的括号,这意味着我可以将动态的可变长度参数从一个方法传递到另一个方法......