0

我正在将本机 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

2 回答 2

1

好的,很抱歉用问题来纠缠你,但这个例子对我来说并不是很清楚。

现在我对情况有了更好的处理,是的,我认为你的方法是可行的。请注意,当回调更改系统状态时,不会出现可能与同时发生的其他事件发生冲突的“副作用”。

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

一般来说,您必须小心,因为虽然您之前的代码为了可预测性而牺牲了响应能力(例如,在第一次下载完成之前什么都不会发生),但现在事情会以更不可预测的顺序发生,您有时可能会引入难以正确处理的细微错误诊断或复制。

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

于 2012-05-28T17:52:11.343 回答
1

在为远程交互设计接口时,您通常应该使操作尽可能粗粒度,以减少延迟。

特别是,您可以将“下载”和“上传”合并为单一操作。通过这种方式,您可以减少单次往返的延迟并消除多个等待状态。

于 2012-05-28T14:23:13.723 回答