如何在Actionscript 3中保持事件处理程序的活动

时间:2015-03-31 15:47:05

标签: actionscript-3 events event-handling

我有一个连接到JBoss / MS-SQL后端的Flex应用程序。我们的一些客户在他们的JBoss前面有一个代理服务器,超时为90秒。在我们的应用程序中,对于复杂的标准,搜索可能需要2-3分钟。由于代理不够聪明,无法识别AMF保持活动的代码,因此代理会向客户端发送503,这会在Flex域中成为“Channel Call Failed”事件。在搜索SO和其他地方时,这似乎是一个常见问题。我们无法对代理做任何事情或延长超时,应用程序需要处理它。

当然后端继续处理并最终将结果发送给客户端。但是用户收到一条丑陋的错误消息,并认为应用程序已损坏。

我已经解决的解决方案是消耗CCF错误并让客户端继续等待。我已经管理了第一部分,但我无法弄清楚如何保持客户端的处理程序处于活动状态以接收数据(和/或在必要时消耗另一个超时)。

当前错误处理程序:

private function handleSearchError(event : FaultEvent) : void {

    if (event.fault.faultCode == "Channel.Call.Failed") {
       event.stopImmediatePropagation();  // doesn't seem to help
       return;
    }

    if (searchProgress != null) {
        PopUpManager.removePopUp(searchProgress);
        searchProgress = null;
    }

    etc...
}

这是设置:

<mx:Button id="btnSearch" label="
    {resourceManager.getString('recon_perspective',
    'ReconPerspective.ReconView.search')}" icon="{iconSearch}"
    click="handleSearch()" includeIn="search, default"/>

<mx:method name="search" result="event.token.resultHandler(event);"
   fault="handleSearchError(event);"/>

开始通话:

var token : AsyncToken = null;

token = sMSrv.search(searchType.toString(), getSearchMode(), criteria,
    smartMatchParent.isArchiveMode);

searchProgress = LoadProgress(PopUpManager.createPopUp
    (FlexGlobals.topLevelApplication as DisplayObject, LoadProgress, true));
searchProgress.title = resourceManager.getString('matching', 'smartmatch.loading.trans');
searchProgress.token = token;
searchProgress.showCancelButton = true;
PopUpManager.centerPopUp(searchProgress);

token.resultHandler = handleSearchResults;
token.cancelSearch = false;

所以我的问题是如何将handleSearch和handleSearchError保持活动以使用来自服务器的事件?

我验证了数据在浏览器中使用WebDeveloper从服务器返回,以观察网络流量,如果您让应用程序刷新该屏幕,则会显示数据。

1 个答案:

答案 0 :(得分:0)

我很有经验,但这有帮助吗?

private function handleSearchError(event : FaultEvent) : void {

if (event.fault.faultCode == "Channel.Call.Failed") {
   event.stopImmediatePropagation();  // doesn't seem to help
     if(event.isImmediatePropagationStopped(true)) {
         //After stopped do something here?
}

   return;
}

if (searchProgress != null) {
    PopUpManager.removePopUp(searchProgress);
    searchProgress = null;
}

etc...

}