0

我有一个接收单个字符串作为参数的 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 中的一个严重错误。我对么?

有人请指教...

4

1 回答 1

0

我找到了解决方案。这不是 Actionscript 中的错误,而是语言中的一些奇怪之处。

可以在此处找到有关该解决方案的基本信息:

AS3 可变长度参数展开以使用 var length args 调用另一个函数

根据那里的情况,我需要在用于 invokeCallwithParams 的方法中执行以下操作:

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

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

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

于 2013-05-15T18:19:47.750 回答