PollingProvider.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:5k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.0.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ /**
  2.  * @class Ext.direct.PollingProvider
  3.  * @extends Ext.direct.JsonProvider
  4.  *
  5.  * <p>Provides for repetitive polling of the server at distinct {@link #interval intervals}.
  6.  * The initial request for data originates from the client, and then is responded to by the
  7.  * server.</p>
  8.  * 
  9.  * <p>All configurations for the PollingProvider should be generated by the server-side
  10.  * API portion of the Ext.Direct stack.</p>
  11.  *
  12.  * <p>An instance of PollingProvider may be created directly via the new keyword or by simply
  13.  * specifying <tt>type = 'polling'</tt>.  For example:</p>
  14.  * <pre><code>
  15. var pollA = new Ext.direct.PollingProvider({
  16.     type:'polling',
  17.     url: 'php/pollA.php',
  18. });
  19. Ext.Direct.addProvider(pollA);
  20. pollA.disconnect();
  21. Ext.Direct.addProvider(
  22.     {
  23.         type:'polling',
  24.         url: 'php/pollB.php',
  25.         id: 'pollB-provider'
  26.     }
  27. );
  28. var pollB = Ext.Direct.getProvider('pollB-provider');
  29.  * </code></pre>
  30.  */
  31. Ext.direct.PollingProvider = Ext.extend(Ext.direct.JsonProvider, {
  32.     /**
  33.      * @cfg {Number} priority
  34.      * Priority of the request (defaults to <tt>3</tt>). See {@link Ext.direct.Provider#priority}.
  35.      */
  36.     // override default priority
  37.     priority: 3,
  38.     
  39.     /**
  40.      * @cfg {Number} interval
  41.      * How often to poll the server-side in milliseconds (defaults to <tt>3000</tt> - every
  42.      * 3 seconds).
  43.      */
  44.     interval: 3000,
  45.     /**
  46.      * @cfg {Object} baseParams An object containing properties which are to be sent as parameters
  47.      * on every polling request
  48.      */
  49.     
  50.     /**
  51.      * @cfg {String/Function} url
  52.      * The url which the PollingProvider should contact with each request. This can also be
  53.      * an imported Ext.Direct method which will accept the baseParams as its only argument.
  54.      */
  55.     // private
  56.     constructor : function(config){
  57.         Ext.direct.PollingProvider.superclass.constructor.call(this, config);
  58.         this.addEvents(
  59.             /**
  60.              * @event beforepoll
  61.              * Fired immediately before a poll takes place, an event handler can return false
  62.              * in order to cancel the poll.
  63.              * @param {Ext.direct.PollingProvider}
  64.              */
  65.             'beforepoll',            
  66.             /**
  67.              * @event poll
  68.              * This event has not yet been implemented.
  69.              * @param {Ext.direct.PollingProvider}
  70.              */
  71.             'poll'
  72.         );
  73.     },
  74.     // inherited
  75.     isConnected: function(){
  76.         return !!this.pollTask;
  77.     },
  78.     /**
  79.      * Connect to the server-side and begin the polling process. To handle each
  80.      * response subscribe to the data event.
  81.      */
  82.     connect: function(){
  83.         if(this.url && !this.pollTask){
  84.             this.pollTask = Ext.TaskMgr.start({
  85.                 run: function(){
  86.                     if(this.fireEvent('beforepoll', this) !== false){
  87.                         if(typeof this.url == 'function'){
  88.                             this.url(this.baseParams);
  89.                         }else{
  90.                             Ext.Ajax.request({
  91.                                 url: this.url,
  92.                                 callback: this.onData,
  93.                                 scope: this,
  94.                                 params: this.baseParams
  95.                             });
  96.                         }
  97.                     }
  98.                 },
  99.                 interval: this.interval,
  100.                 scope: this
  101.             });
  102.             this.fireEvent('connect', this);
  103.         }else if(!this.url){
  104.             throw 'Error initializing PollingProvider, no url configured.';
  105.         }
  106.     },
  107.     /**
  108.      * Disconnect from the server-side and stop the polling process. The disconnect
  109.      * event will be fired on a successful disconnect.
  110.      */
  111.     disconnect: function(){
  112.         if(this.pollTask){
  113.             Ext.TaskMgr.stop(this.pollTask);
  114.             delete this.pollTask;
  115.             this.fireEvent('disconnect', this);
  116.         }
  117.     },
  118.     // private
  119.     onData: function(opt, success, xhr){
  120.         if(success){
  121.             var events = this.getEvents(xhr);
  122.             for(var i = 0, len = events.length; i < len; i++){
  123.                 var e = events[i];
  124.                 this.fireEvent('data', this, e);
  125.             }
  126.         }else{
  127.             var e = new Ext.Direct.ExceptionEvent({
  128.                 data: e,
  129.                 code: Ext.Direct.exceptions.TRANSPORT,
  130.                 message: 'Unable to connect to the server.',
  131.                 xhr: xhr
  132.             });
  133.             this.fireEvent('data', this, e);
  134.         }
  135.     }
  136. });
  137. Ext.Direct.PROVIDERS['polling'] = Ext.direct.PollingProvider;