Flex - 如何在触发FaultEvent时获取传递给RemoteObject调用的参数?

时间:2012-05-11 11:32:43

标签: flex parameters remoteobject

我在循环中调用RemoteObject方法。此方法接收行id作为删除数据库中的行的参数。在循环内部,可以立即进行大量调用。一些调用可以触发FaultEvent。如何检测触发FaultEvent的行ID?

远程对象:

<mx:RemoteObject id="myTableFactory" destination="myTableFactoryFactory"/>

循环:

myTableFactory.addEventListener(FaultEvent.FAULT, faultFunction);
for each (var myTableRow:myTable in rowsToBeExcludedArray)
{
  myTableFactory.removeMyTableRow(myTableRow.id);
}

private function faultFunction(e:FaultEvent):void
{
  // The main question. How to get myTableRow.id that fired the FaultEvent
}

感谢。

Carlos Lima。

2 个答案:

答案 0 :(得分:1)

你一定要阅读AsyncToken

RemoteObject上的每个远程过程调用都将返回一个:

var token:AsyncToken = myTableFactory.removeMyTableRow(myTableRow.id);

现在,您可以使用此令牌执行两项操作。

添加回复者

您可以为每个调用添加Responder,这样您就可以为每个调用设置唯一的处理程序:

token.addResponder(new Responder(handleResult, handleFault));

在尝试此操作之前,请务必删除全局结果和错误处理程序。此外,我在这里使用了默认的Responder类,但任何实现IResponder的类都可以。

背驮你的身份

您可以向令牌添加新属性,因为它是动态类。例如,id可能派上用场:

token.removedId = myTableRow.id;

或者甚至整个班级:

token.removedRow = myTableRow;

现在,您可以在事件处理程序中找到这些值:

private function handleResult(event:ResultEvent):void {
    trace(event.token.removedId);
}

同样的原则适用于FaultEvent

答案 1 :(得分:0)

如果您不喜欢小心支持AsyncToken的想法(我并不特别认为这是不切实际的),您可以非常轻松地检索原始请求的详细信息。

我在使用BlazeDS遇到DuplicateSessionDetected错误时使用此技术,以取消客户端ID并重新发出原始请求。

private function handleFault(event:FaultEvent):void
{
    const remoteObject:RemoteObject = (event.target as RemoteObject);
    const message:RemotingMessage = (event.token.message as RemotingMessage);

    message.clientId = null;
    remoteObject.getOperation(message.operation)
        .send.apply(null, message.body);
}

希望有所帮助!