深入浅出dwr系列教程之3.engine.js的功能详解

2019-03-10 07:42|来源: 网友

engine.jsDWR非常重要,因为它是用来转换和动态生成javascript的接口供函数调用的js库文件,所以只要用到DWR的地方就需要导入它。

<script type="text/javascript"src="/[YOUR-WEB-APP]/dwr/engine.js"></script>

功能介绍:我们主要可以操作js对象DWREngine来操作一些API,可以设置一些DWR执行性能或着执行方式等。主要针对DWR界面通过js调用java对象方法的时候可以使用DWREngine对象进行一些辅助的设置等!

(1)批量调用:可以使用batch来批量的执行远程调用(DWR界面通过js调用java对象)。这样可以减少与服务器的交互次数,所以可以提交反应速度。就是说一个批量执行不管内部调用了几个java方法都将只与服务器交互一次。

原理规则:一个batchDWREngine.beginBatch()开始 ,并以DWREngine.endBatch()结束。

DWREngine.endBatch()被调用,就结束了该次远程调用,这样DWR就在一次与服务器的交互中执行batch中所有的调用。

注意:DWR会小心的处理保证所有的回调函数都会被调用,所以你可以明显的打开和关闭批处理。只要别忘了调用endBatch(),否则所有的远程调用将永远的处于列队中,不会得到返回,更不会调用回调函数。

例子:界面js调用java对象时的批量调用写法

//批量调用开始
      DWREngine.beginBatch();
      Remote.methodInBatch1(params,callback1);
      Remote.methodInBatch2(params,callback2);
      //
批量调用结束,结束endBatch()方法中可以传递一些参数,像超时和异常处理等
      DWREngine.endBatch(

       //超时时间3000毫秒,这属于局部超时属性的设置,
             //
所以只在该batch中起作用,对batch之外的调用不起作用
             { timeout:3000}
       );
     
说明:batch中的两个调用将只进行一次请求,并且回调函数会正常被调用,这样就提高了效率!如果同一个batch中设置了多个相同的选项的值,例如除了endBatch()设置了超时,两个调用中也设置了超时选项,那么对于该batch中只有最后一个设置会起作用,之前的设置DWR将会忽略

(2)顺序调用:因为Ajax一般是异步调用,所以远程调用不会按照发送的顺序返回。DWREngine.setOrdered(boolean) 允许结果严格按照发送的顺序返回。如果设置true的话DWR将在旧的请求安全返回以后才去发送新的请求。默认为false,一般不会设置成true

(3)错误警告和超时:

<1>处理错误和警告:当因为一些原因调用失败,DWR就会调用错误和警告handler处理机制(根据错误的激烈程度),并传递错误消息。
         
分析:就是当出现错误后我们可以指定让DWR转去调用我们指定的js函数中去执行
         
方案:DWREngine.setErrorHandler(function)来改变错误处理方式,DWREngine.setWarningHandler(function)来改变警告处理方式,在作为参数传入的js函数中就可以进行alert()信息或其他处理。

<2>设置超时:通过DWREngine.setTimeout()可以设置js调用java对象请求超时的时间,可以设置全局(任何js调用之前设定,类似全局变量的设定)超时时间,也可以设定局部超时时间,例如一个batch中有效的超时设定。

注意:如果调用超时发生(也就是超时了),错误处理器就会被调用,即DWREngine.setErrorHandler(function)指定的方法就会被调用。

例子:  

Remote.method(params,{ callback:function(data){

alert("it worked");

},

errorHandler:function(message){ alert("it broke");},

timeout:1000

} );

说明:如果Remote.method()调用超过了1秒钟还没有返回,errorHandler指定的函数会被调用,即"it broke"消息就会被显示

(4)远程调Hooks :如果你想在DWR调用之前出现一个提示,你可以设置pre-hook函数。它将会被调用,但是没有参数传递到这个函数。当你希望让一些按钮在调用期间变灰来防止被再次使用,这一功能将会很有用。 post-hook用来和pre-hook一起使用来恢复pre-hook指定的函数所做的一些改变。
     
使用方法:通过DWREngine.setPreHook(function) DWREngine.setPostHook(function)来注册将被调用的js函数
     
(5)
远程调用选项(用到时再查看文档)DWR有一些选项用来控制远程调用的处理方式。methodverb对于用户应该是透明的,但是不同的浏览器效果可能不一样。一般来说DWR会选择正确方法来处理,但是这些选项对于在不同效果的浏览器之间开发很有用。

<1>DWREngine.setAsync(flag)方法:指定让XHR异步调用了吗? 默认为true。警告如果你使用的时IFrame或者ScriptTag这一选项被忽略。 一般来说把他变成false是个糟糕的做法。因为那样会使你的浏览器变慢。
       
参数值:
             true  
设置成异步交互,也是默认值
             false
设置成同步交互,不推荐设置成false
       <2>DWREngine.setMethod(newmethod)
方法: setMethod()不能保证一定使用你选择的newmethod方法, 它只是保证首先尝试使用那个方法。 newmethod必须是DWREngine.XMLHttpRequest或者DWREngine.IFrame或者DWREngine.ScriptTag中之一。
        <3>DWREngine.setVerb(verb)
方法: 这个选项允许你选择POSTGET,无论是用IFrame还是XMLHttpRequest方法。 一些浏览器(例如旧版的Safari)不支持XHR-POST所以DWR就自动切换到GET 即使你设置的verbPOST。所以setVerb()应当被仅仅做为一个提示。如果使用ScriptTag方法来远程调用,设置verb是没有用的
     
例子:
      A.
设置全局远程调用的verb DWREngine.setVerb("GET");
      B.
设置单次调用局部verb

Remote.method(params,{callback:function(data) { ... },
              verb:"GET"
      });

      C.设置batch级别的局部verb

DWREngine.beginBatch();
      Remote.method1(params,callback1);
       Remote.method2(params,callback2);
       DWREngine.endBatch({verb:"GET" });

相关问答

更多

将参数发送到具有0个参数的函数时的行为不一致(Inconsistent behavior when sending parameters to a function with 0 parameters)

从6.5.2.2函数调用 : 2 - 如果表示被调用函数的表达式具有包含原型的类型,则参数数量应与参数数量一致。 [...] VC是故意允许的,以便允许编译(为了兼容)错误的代码。 标准允许这样做,因为只要还发出诊断,就允许在遇到某些类型的错误代码时执行此操作。 From 6.5.2.2 Function calls: 2 - If the expression that denotes the called function has a type that includes a prototy

将属性放在“this”上时为什么不保留引用?(Why reference not kept when putting attribute on `this`?)

问题是你的代码重新分配了本地parts变量,它最终指向this.parts的不同数组。 解决方案是将代码更改为: function loadParts() { parts.splice(0, parts.length, 'engine', 'wheels'); } 这将改变相同阵列的内容。 在Javascript中的代码 var x = [1, 2, 3]; var y = x; x = [4, 5, 6] 不会改变y指向的内容。 这就是你的代码正在做的事情( y是this.part

jQuery Resizable:如何在调整大小拖动期间获取重叠元素(jQuery Resizable: How to get overlapping element during the resize drag)

elementFromPoint应该工作。 但是像这样使用它时的一个问题是辅助程序总是成为鼠标下的元素。 你可以做的是隐藏帮助器,然后获取elementFromPoint,然后再次显示它。 它应该在大多数时间工作,除非你有许多重叠元素。 像这样举例如: $('#resize').resizable({ resize: function(event, ui) { $('.over').removeClass('over') ui.helper.hide(); $

如何使用PHPActiveRecord计算行中的唯一值?(How to count unique values in rows with PHPActiveRecord?)

phpAR中有一个count()函数,但你无法使用DISTINCT。 所以,我认为最简单的是: $total = SomeModel::first(['select' => 'COUNT(DISTINCT `number`) AS `total`'])->total; There is a count() function in phpAR, but you can't make it work with DISTINCT. So, I think the easiest is: $total

AngularJS - 从字符串数组中连续更改文本(AngularJS - Change text continuously from a array of strings)

我相信你正在寻找$ interval 。 var i = 0; var array = ['A', 'B', 'C', 'D', 'E']; $interval(function () { $scope.notes = array[i++ % array.length]; }, 1000); 请参见此处的示例: https : //jsfiddle.net/8pLwjybf/3/ I believe you are looking for $interval. var i = 0; va

相关文章

更多

最近更新

更多