如何在具有不同接收器实现的情况下附加请求上下文

时间:2011-12-14 03:06:35

标签: gwt requestfactory

在Google io 2011中,David Chandler提到您可以使用append()方法链接不同的请求上下文,但在实践中,我不知道如何在它们具有不同的接收器时将它们链接起来,使用to()和然后火()?

请帮忙。

1 个答案:

答案 0 :(得分:6)

有两种接收器:绑定到每个方法调用的接收器(传递给Request的{​​{1}}方法),以及上下文级别的接收器(传递给to()的{​​{1}}方法。 RequestContext的{​​{1}}方法是fire()的简写,即它将Request绑定到方法。

方法级接收器仅依赖于方法,它们的通用参数化取决于方法的返回值(fire(Receiver)to(receiver).fire()的通用参数化),因此您是否Receiver几个Request一起改变了一切。

上下文级接收器始终使用InstanceRequest进行参数化。当您append()上下文时,它们实际上形成了一个带有多个接口的上下文,因此您只需在任何一个附加的上下文中调用RequestContext一次。

现在让我们回到基础:不使用Void,您只能批量一起调用在上下文界面上声明的方法。如果您要使用两个不同的上下文接口,则必须生成两个append(),即两个HTTP请求。 fire()的引入允许您将在任何上下文接口上声明的方法的调用一起批处理:只需将上下文附加到另一个上下文,并且两个上下文中的调用将在同一HTTP请求中一起批处理,由唯一的{{在附加的任何一个上下文中都有{1}}。

现在进入技术细节:在内部,上下文只不过是一个围绕 state 对象的瘦包装器。当您append()fire()代理时,您将其添加到内部状态,并在调用服务方法时,方法名称(实际上,其模糊令牌)并且参数被捕获并推送到状态。当您append()上下文时,您只是将其与其附加的上下文之一共享其内部。这样,当你在附加的上下文上调用服务方法时,它会推送到与其他上下文完全相同的状态,并且当你fire()中的任何一个上下文时, state被序列化为单个HTTP请求 请注意,要附加上下文,其自身的内部状态必须为空,否则将引发异常,因为状态将被抛弃以替换为其他上下文之一。

简而言之,在实践中:

edit()

请注意,创建和附加第二个上下文的行同样可以写成:

create()

append()方法返回其参数是为了方便,但它与参数传递的值完全相同。这只是为了允许在上面写一个单行,而不是强制使用双线。