解耦GWT异步回调
我有以下问题: 我正在尝试使用GWT建模一个流程,其中我有几个视图和几个提交按钮。按下按钮1将创建一个服务器交互,如果一切正常,将加载下一个视图。我的问题是现在我得到了非常讨厌的意大利面代码(只是非常高的级别来告诉你我的意思):解耦GWT异步回调,gwt,asynchronous,coding-style,state-pattern,Gwt,Asynchronous,Coding Style,State Pattern,我有以下问题: 我正在尝试使用GWT建模一个流程,其中我有几个视图和几个提交按钮。按下按钮1将创建一个服务器交互,如果一切正常,将加载下一个视图。我的问题是现在我得到了非常讨厌的意大利面代码(只是非常高的级别来告诉你我的意思): 有没有办法创造某种抽象的东西?也许是国家模式?怎么用?非常感谢 避免小部件之间耦合的建议方法是使用EventBus。请在此处阅读更多详细信息 希望有帮助。在GWT中,意大利面代码是一个棘手的问题,就像在Javascript中一样,在Javascript中,您的大部分代码
有没有办法创造某种抽象的东西?也许是国家模式?怎么用?非常感谢 避免小部件之间耦合的建议方法是使用EventBus。请在此处阅读更多详细信息
希望有帮助。在GWT中,意大利面代码是一个棘手的问题,就像在Javascript中一样,在Javascript中,您的大部分代码都是围绕异步回调构建的
答案中描述的一些技术可以应用。从一开始就使用MVP。使用活动和场所。你的代码将是干净的
changeview(boolean first){
if(first)
{
firstView.setVisible(true);
secondView.setVisible(false);
}else{
firstView.setVisible(false);
secondView.setVisible(true);
}
}
onClick {
AsyncCallback {
onSuccess {
changeView(false);
}
}
}
通过上面的方法在视图之间切换。这实际上是一个非常好的问题,而且可能没有明确的答案。这是一个适用于许多框架的问题,不仅仅是GWT,所以我喜欢您的想法,用一些简化的代码来看待这一点。我将把它延长一点,以展示哪怕只有4个非常简单的回调: 嵌套回调
alice.call(“a”,新回调(){
@凌驾
成功时的公共无效(){
调用(“b”,新回调(){
@凌驾
成功时的公共无效(){
charlie.call(“c”,新回调(){
@凌驾
成功时的公共无效(){
call(“d”,新回调(){
@凌驾
成功时的公共无效(){
//完成
}
});
}
});
}
});
}
});
命名回调
您可以使用IDE轻松地将其重构为命名回调(提示:请自下而上阅读回调!):
final Callback daisyCallback=new Callback(){
@凌驾
成功时的公共无效(){
//完成
}
};
最终回调charlichtallback=新回调(){
@凌驾
成功时的公共无效(){
daisy.呼叫(“d”,daisyCallback);
}
};
最终回调bobCallback=新回调(){
@凌驾
成功时的公共无效(){
查理。呼叫(“c”,Charback);
}
};
最终回调aliceCallback=新回调(){
@凌驾
成功时的公共无效(){
鲍勃。呼叫(“b”,山猫回叫);
}
};
alice.call(“a”,aliceCallback);
- 问题:控制流不再那么明显了
- 尽管如此,IDE仍然可以通过使用“搜索引用”(Eclipse中的Ctrl-G)或类似的方法来提供帮助
alice.call(“a”,新回调(){
@凌驾
成功时的公共无效(){
bus.fireEvent(BusEvent.ALICE_成功事件);
}
});
bus.addEventListener(BusEvent.ALICE_SUCCESSFUL_事件,新的BusEventListener(){
@凌驾
公共无效事件(最终总线事件总线事件){
调用(“b”,新回调(){
@凌驾
成功时的公共无效(){
bus.fireEvent(BusEvent.BOB_成功事件);
}
});
}
});
bus.addEventListener(BusEvent.BOB_SUCCESSFUL_事件,新的BusEventListener(){
@凌驾
公共无效事件(最终总线事件总线事件){
charlie.call(“c”,新回调(){
@凌驾
成功时的公共无效(){
bus.fireEvent(BusEvent.CHARLIE_成功事件);
}
});
}
});
bus.addEventListener(BusEvent.CHARLIE_SUCCESSFUL_事件,新的BusEventListener(){
@凌驾
公共无效事件(最终总线事件总线事件){
call(“d”,新回调(){
@凌驾
成功时的公共无效(){
bus.fireEvent(BusEvent.DAISY_成功事件);
}
});
}
});
bus.addEventListener(BusEvent.DAISY_SUCCESSFUL_事件,新的BusEventListener(){
@凌驾
公共无效事件(最终总线事件总线事件){
//完成
}
});
- 在适当的情况下(当每个事件的含义非常清楚时 如果没有太多),这种模式可以使事情变得非常好和清晰
- 但在其他情况下,它会使控制流更加混乱(并且很容易得到两行代码)
- 使用IDE来了解控制流比较困难
- GWT历史机制是合理使用该技术的一个非常积极的例子
final Callback charlichtallback=new Callback(){
@凌驾
成功时的公共无效(){
call(“d”,新回调(){
@凌驾
成功时的公共无效(){
//完成
}
});
}
};
call(“a”,新回调(){
@凌驾
成功时的公共无效(){
调用(“b”,新回调(){
@凌驾
成功时的公共无效(){
查理。呼叫(“c”,Charback);
}
});
}
});
根据不同的情况,两个嵌套回调通常仍然是可读的,并且它们将读取代码时方法之间的跳跃减少了50%
(我在这里创建了一个我的示例粘贴箱,如果你想玩的话:)BusEventHandler看起来比BusEventListener更适合GWT风格我想我应该补充一点注意:这些示例不是实际的GWT代码!非常感谢你的帮助!我现在选择了MVP/总线架构,它的工作方式很有魅力!
changeview(boolean first){
if(first)
{
firstView.setVisible(true);
secondView.setVisible(false);
}else{
firstView.setVisible(false);
secondView.setVisible(true);
}
}
onClick {
AsyncCallback {
onSuccess {
changeView(false);
}
}
}