我正在将本机Java应用程序转换为GWT。与服务器的通信仅在状态更改期间发生,并且到目前为止,已通过阻止操作来处理。

例如当前同步逻辑:

void onUserClickedSync() {
    downloadData(); // blocking operation
    uploadData(); // blocking operation
    setState(DONE);
}


如何使用利用异步回调的方法来代替阻塞操作?

我当前的想法是实质上添加一堆额外的“忙”状态,这些状态什么也没做。然后,我将使用来自RPC的回调来触发下一个状态,在该状态下逻辑可以继续。

例如同步逻辑将变为:

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);
}


这种方法有效吗?我需要注意什么?

编辑:用伪代码重写了我的示例,因为它们非常不清楚。

最佳答案

好的,很抱歉给您打扰您,但这个例子对我来说并不十分清楚。

现在,我可以更好地处理这种情况了,我认为您的方法是可行的。
请注意,当回调更改系统状态时,没有任何可能与同时发生的其他事件发生冲突的“副作用”。

具体来说,目前尚不清楚您是否正在“等待多个回调”(即用户开始了4次上传,因此您可能会获得4个回调,而不一定按“正确的顺序”)。另外,uploaddata方法是否有可能在相应的downloaddata之前结束?

通常,您必须小心,因为尽管先前的代码牺牲了响应能力以实现可预测性(例如,直到第一次下载完成,否则什么也不会发生),现在事情以更加不可预测的顺序发生,并且有时您可能会引入一些细微的错误,这些错误很难正确地解决。诊断或繁殖。

我们看不到应用程序的其余部分,因此不清楚回调之间可能还会发生什么,但我敦促您对此非常谨慎,并使回调错误处理特别健壮(即,如果上传中途失败?您是否仍从服务器收到回调通知它已中止?您将转移到什么状态?)

10-08 13:41