我正在将原生Java应用程序转换为GWT。与服务器的通信仅在状态更改期间发生,到目前为止已通过阻止操作来处理。
e.g。 当前同步逻辑:
void onUserClickedSync() {
downloadData(); // blocking operation
uploadData(); // blocking operation
setState(DONE);
}
如何使用异步回调替换阻塞操作?
我目前的想法是基本上添加一堆额外的“忙”状态,这些状态不做任何事情。然后我将使用来自RPC的回调来触发下一个状态,逻辑可以继续。
e.g。 同步逻辑将变为:
void onUserClickedSync() {
rpc.downloadData(new AsyncCallback<Data> {
public void onSuccess(Data result) {
//...
onDownloaded();
}
//...
});
setState(WAITING_FOR_DOWNLOAD);
}
void onDownloaded() {
rpc.uploadData(new AsyncCallback<Void> {
public void onSuccess(Void void) {
//...
setState(DONE);
}
//...
});
setState(WAITING_FOR_UPLOAD);
}
这种方法有效吗?我需要注意什么?
编辑:以伪代码重写我的例子,因为它们非常不清楚。
答案 0 :(得分:1)
在设计用于远程交互的界面时,通常应该尽可能粗略地进行操作,以减少延迟。
特别是,您可以将“下载”和“上传”合并为单个操作。这样,您可以减少单次往返的延迟并消除多个等待状态。
答案 1 :(得分:1)
好的,抱歉纠缠于你的问题,但这个例子对我来说并不是很清楚。
既然我已经更好地处理了这种情况,我认为你的方法是可行的。 请注意,当回调改变系统状态时,没有“副作用”可能会与同时发生的其他事件发生冲突。
具体而言,目前尚不清楚你是否“等待多次回调”(即用户开始上传4次,因此你可能会得到4次回调,不一定是“正确的顺序”)。另外,uploaddata方法是否有可能在相应的downloaddata之前结束?
一般情况下,你必须要小心,因为虽然你之前的代码牺牲了对可预测性的响应性(例如,在第一次下载完成之前没有任何事情发生),现在事情发生在一个更难以预测的顺序中,你有时会引入一些相当微小的错误难以正确诊断或复制。
我们没有看到应用程序的其余部分,因此不清楚回调之间可能会发生什么,但我建议您对此非常小心,并且还要使回调错误处理特别健壮(即,什么如果上传中途失败会发生什么?你是否仍然收到来自服务器的回调,告诉你它已经中止了?你移动到什么状态呢?)