0

我的代码用于向多个用户发送电子邮件。用户将单击发送按钮,然后调用 rpc。现在,如果用户单击取消按钮。正在进行的 rpc 应该被取消。. 任何人都可以帮忙吗?

我google了很多,他们已经介绍了Request Builder的概念。但我没有得到任何完美的想法。

4

3 回答 3

7

使您的异步方法返回 aRequest而不是,void以便您可以调用cancel()它。

出于同样的原因,异步方法没有返回类型。他们通常返回无效。如果您希望更好地控制待处理请求的状态,请改为返回 Request。

来源:https ://developers.google.com/web-toolkit/doc/latest/DevGuideServerCommunication#DevGuideCreatingServices

仅供参考,您也可以RequestBuilder用作返回类型,然后您必须send()自己调用该方法(在可能自定义请求之后,例如添加标头)以实际向服务器发出请求。

当然,如果您需要告诉服务器中止处理,则必须进行另一个 RPC 调用。

于 2012-10-15T08:25:21.727 回答
1

该请求是异步的,因此客户端可以做任何它想做的事情。您需要做的就是添加一个标志以指示应该取消请求,然后更改onSuccess检查标志的方法,如果已设置则不执行任何操作。

您应该在每次提出请求时清除requestCancelled标志 - 否则在第一个请求被取消后,您将无法再提出另一个......

例如

boolean requestCancelled = false;

void onSuccess(...)
{
    if (!requestCancelled) {
        // actual response handing code
    }
}

如果真的要取消服务器端的请求,就复杂了很多。您可以通过发送第二个请求来做到这一点 - 一个功能是取消请求。为了使这项工作,“取消请求”必须在“电子邮件请求”可以读取的地方设置一个字段。“电子邮件请求”需要检查“取消字段”是否已设置。

// server side Impl
void cancelRequest()
{
    // You need to implement this class and ensure it really is a singleton
    // and thread safe.
    RequestStatusSingleton.setCancelled(true);
}

void serverSideEmailFunc()
{
    while(modeEmailAddrs && ! RequestStatusSingleton.getCancelled()) {
        // get next address and send email
    }
}

显然,这是很多工作。你有没有考虑过:

  1. GUI 上没有取消按钮?
  2. 让服务器一次处理几封电子邮件(即客户端发送多个请求,直到服务器告诉客户端所有电子邮件都已完成)。
于 2012-10-15T05:53:20.120 回答
0

我完全理解你的用户。没有人愿意等待 15 秒。

没有“杀死”请求的标准方法,因为没有办法知道你的服务器/数据存储在哪里实现它。除非您处理的流程可以放入可以回滚的单个事务中,否则您将不得不实现自己的逻辑。例如,如果您要求服务器保存一个实体,您将不得不告诉服务器再次保存该实体,但这次不做任何更改。

另外,请再次考虑您的用例。为什么用户想要终止请求?可能他只是想去应用程序中的另一个地方。那么就不需要杀死请求了:当响应到达时,检查用户是否还在原地耐心等待。如果没有,请不要执行 onSuccess()。

于 2012-10-15T05:53:44.463 回答