GWT:向服务器发出请求后继续编辑同一对象

Posted

技术标签:

【中文标题】GWT:向服务器发出请求后继续编辑同一对象【英文标题】:GWT: Continue editing the same object after request to server 【发布时间】:2012-08-03 08:58:16 【问题描述】:

GWT 服务器请求后是否可以继续编辑同一个对象?

考虑来自another question 的最佳实践代码

void start() 
    // Either get p
    context1.get(..).to( new Receiver<P>  onSuccess(P resp)p = resp; ... ).fire();
    // OR create p
    p = context2.create( P.class );
    // Then save p
    req = context2.persist(p).to( new Receiver<P>  /* note do not use context1 */
        onViolation(...)  /*JSR 303 handler*/ ;
        onFailure( error )  /* handle */ error.getMessage() ; 
        onSuccess(X x)  /* whatever persist() returns handler */ ;  ); 
    // drive editor with p
    driver.edit( p, req);    


....
void onSave()     
    // editor
    ctxt = driver.flush()  /* note ctxt == context2 */
    if ( driver.hasErrors() )  /*JSR 303 handler*/;
    // RF
    ctxt.fire();

问题是,如何处理最后一行不成功的服务器响应? (将接收器添加到“ctxt.fire();”)

void onSave()     
    // editor
    ctxt = driver.flush()  /* note ctxt == context2 */
    if ( driver.hasErrors() )  /*JSR 303 handler*/;
    // RF
    ctxt.fire(new Receiver<S>
        onSuccess()  ... how to continue editing the "p" object? ...  
        onFailure()  ... how to continue editing the "p" object? ...  );
    );

例如,在保存时,服务器会进行一些额外的验证(例如,该值是唯一的)。并且不接受保存。

因此,服务器请求以“onSuccess(response)”方法结束,但对象未保存(响应值可能包含错误列表)。

是否可以允许用户继续编辑 未保存但在客户端更新 对象并向服务器发出另一个请求?

我看到的“僵局”:

无法重用请求上下文 (ctxt),因为会抛出“A request is already in progress”异常。 无法创建新上下文,因为对对象的所有修改都在旧上下文中(因此它们会丢失)。

【问题讨论】:

【参考方案1】:

可变代理总是绑定到请求上下文。但是,您从服务器接收到的代理被冻结且不可变。 .edit 方法将为给定的请求上下文创建一个冻结代理的可变克隆。

如果无法触发请求(连接问题、服务器错误),上下文将可重复使用,您可以继续编辑代理。如果违反了约束,同样适用。 如果请求成功触发(无论服务器方法是否抛出异常),请求上下文就不能再使用,代理也是如此。

查看AbstractRequestContext 中的onTransportSuccess - 这将告诉您:您可以继续使用请求上下文的唯一情况是违规和一般失败。因此,要么强制执行违规,要么将(错误的)对象返回给客户端并使用新的请求上下文继续处理它(这将导致实体代理出现问题,因为它会丢失参考状态)

【讨论】:

以上是关于GWT:向服务器发出请求后继续编辑同一对象的主要内容,如果未能解决你的问题,请参考以下文章

浏览器在请求失败时自行发出请求,当互联网重新连接时

通过 Expo 向 localhost 发出 HTTP 请求

在同一本地网络上从计算机向手机发出 POST 请求

Django CSRFToken 中间件附加到 URL 并在向服务器发出“PUT”请求后显示。 (AJAX 问题)

浏览器刷新页面后向服务器发出两次请求的问题

node.js http.get 在向远程站点发出 5 次请求后挂起