DWR的同步与异步

    技术2022-05-12  1

    AJAX是用来实现异步调用的,但有些情况下,我们必须要实现同步效果,避免有关联的方法调用顺序被打乱。比如,一个编辑文章的页面有两个select下拉选框(id分别为s1和s2),显示该篇文章所在的父分类和子分类。子分类的内容根据父分类的选择发生变化。会有如下三个方法调用(每个function的具体代码省略,不在讨论范围):

        <script type="text/javascript">

         //初始化第一个下拉框(这篇文章的父分类)       initselect(document.getElementById('s1'),'<s:property value="news.parentType"/>');

         //根据第一个下拉框选中内容到数据库中查询第二个下拉框的子分类数据

           DWRNEWSTYPE.getTypeIdByParentType(document.getElementById('s1').value,changeS2Option);

        //初始化第二个下拉框(这篇文章的子分类)      initselect(document.getElementById('s2'),'<s:property value="news.typeId"/>'); </script>

    这段代码嵌入到jsp页面代码中执行,会发生s2原本的子分类并没有被选中(第三个方法没有被执行的感觉),但是选项内容数据确实查询出来的情况。这是因为,第三个方法在dwr执行之前还没返回结果,就已经执行完毕,ajax异步调用也会导致页面出现的结果有很大差别。为了避免这种情况,我们需要在这段代码前设置为同步,最后再改成异步的。

        <script type="text/javascript">

    DWREngine.setAsync(false); //设置是否异步传输为false,即同步

         //初始化第一个下拉框(这篇文章的父分类)       initselect(document.getElementById('s1'),'<s:property value="news.parentType"/>');

         //根据第一个下拉框选中内容到数据库中查询第二个下拉框的子分类数据

           DWRNEWSTYPE.getTypeIdByParentType(document.getElementById('s1').value,changeS2Option);

        //初始化第二个下拉框(这篇文章的子分类)      initselect(document.getElementById('s2'),'<s:property value="news.typeId"/>');

    DWREngine.setAsync(true);   //再设置是否异步传输为true,即异步 </script>


    最新回复(0)