Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解耦GWT异步回调_Gwt_Asynchronous_Coding Style_State Pattern - Fatal编程技术网

解耦GWT异步回调

解耦GWT异步回调,gwt,asynchronous,coding-style,state-pattern,Gwt,Asynchronous,Coding Style,State Pattern,我有以下问题: 我正在尝试使用GWT建模一个流程,其中我有几个视图和几个提交按钮。按下按钮1将创建一个服务器交互,如果一切正常,将加载下一个视图。我的问题是现在我得到了非常讨厌的意大利面代码(只是非常高的级别来告诉你我的意思): 有没有办法创造某种抽象的东西?也许是国家模式?怎么用?非常感谢 避免小部件之间耦合的建议方法是使用EventBus。请在此处阅读更多详细信息 希望有帮助。在GWT中,意大利面代码是一个棘手的问题,就像在Javascript中一样,在Javascript中,您的大部分代码

我有以下问题: 我正在尝试使用GWT建模一个流程,其中我有几个视图和几个提交按钮。按下按钮1将创建一个服务器交互,如果一切正常,将加载下一个视图。我的问题是现在我得到了非常讨厌的意大利面代码(只是非常高的级别来告诉你我的意思):


有没有办法创造某种抽象的东西?也许是国家模式?怎么用?非常感谢

避免小部件之间耦合的建议方法是使用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);
       }
    }
}