1

我在循环中调用 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
}

谢谢。

卡洛斯·利马。

4

2 回答 2

1

您绝对应该阅读AsyncToken

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

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

现在,您可以使用此令牌做两件事。

添加响应者

您可以为每个调用添加一个响应程序,这使您可以为每个调用拥有一个唯一的处理程序:

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

于 2012-05-11T11:51:30.190 回答
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);
}

希望有帮助!

于 2013-02-25T11:34:35.357 回答