/public/ext-4.0.0/src/direct/PollingProvider.js

https://github.com/marekjs/Shacser · JavaScript · 158 lines · 70 code · 17 blank · 71 comment · 11 complexity · f8ecae3cb596a4c8cf0cf827221edcbd MD5 · raw file

  1. /**
  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.Manager.addProvider(pollA);
  20. pollA.disconnect();
  21. Ext.direct.Manager.addProvider(
  22. {
  23. type:'polling',
  24. url: 'php/pollB.php',
  25. id: 'pollB-provider'
  26. }
  27. );
  28. var pollB = Ext.direct.Manager.getProvider('pollB-provider');
  29. * </code></pre>
  30. */
  31. Ext.define('Ext.direct.PollingProvider', {
  32. /* Begin Definitions */
  33. extend: 'Ext.direct.JsonProvider',
  34. alias: 'direct.pollingprovider',
  35. uses: ['Ext.direct.ExceptionEvent'],
  36. requires: ['Ext.Ajax', 'Ext.util.DelayedTask'],
  37. /* End Definitions */
  38. /**
  39. * @cfg {Number} interval
  40. * How often to poll the server-side in milliseconds (defaults to <tt>3000</tt> - every
  41. * 3 seconds).
  42. */
  43. interval: 3000,
  44. /**
  45. * @cfg {Object} baseParams An object containing properties which are to be sent as parameters
  46. * on every polling request
  47. */
  48. /**
  49. * @cfg {String/Function} url
  50. * The url which the PollingProvider should contact with each request. This can also be
  51. * an imported Ext.Direct method which will accept the baseParams as its only argument.
  52. */
  53. // private
  54. constructor : function(config){
  55. this.callParent(arguments);
  56. this.addEvents(
  57. /**
  58. * @event beforepoll
  59. * Fired immediately before a poll takes place, an event handler can return false
  60. * in order to cancel the poll.
  61. * @param {Ext.direct.PollingProvider}
  62. */
  63. 'beforepoll',
  64. /**
  65. * @event poll
  66. * This event has not yet been implemented.
  67. * @param {Ext.direct.PollingProvider}
  68. */
  69. 'poll'
  70. );
  71. },
  72. // inherited
  73. isConnected: function(){
  74. return !!this.pollTask;
  75. },
  76. /**
  77. * Connect to the server-side and begin the polling process. To handle each
  78. * response subscribe to the data event.
  79. */
  80. connect: function(){
  81. var me = this, url = me.url;
  82. if (url && !me.pollTask) {
  83. me.pollTask = Ext.TaskManager.start({
  84. run: function(){
  85. if (me.fireEvent('beforepoll', me) !== false) {
  86. if (Ext.isFunction(url)) {
  87. url(me.baseParams);
  88. } else {
  89. Ext.Ajax.request({
  90. url: url,
  91. callback: me.onData,
  92. scope: me,
  93. params: me.baseParams
  94. });
  95. }
  96. }
  97. },
  98. interval: me.interval,
  99. scope: me
  100. });
  101. me.fireEvent('connect', me);
  102. } else if (!url) {
  103. //<debug>
  104. Ext.Error.raise('Error initializing PollingProvider, no url configured.');
  105. //</debug>
  106. }
  107. },
  108. /**
  109. * Disconnect from the server-side and stop the polling process. The disconnect
  110. * event will be fired on a successful disconnect.
  111. */
  112. disconnect: function(){
  113. var me = this;
  114. if (me.pollTask) {
  115. Ext.TaskManager.stop(me.pollTask);
  116. delete me.pollTask;
  117. me.fireEvent('disconnect', me);
  118. }
  119. },
  120. // private
  121. onData: function(opt, success, response){
  122. var me = this,
  123. i = 0,
  124. len,
  125. events;
  126. if (success) {
  127. events = me.createEvents(response);
  128. for (len = events.length; i < len; ++i) {
  129. me.fireEvent('data', me, events[i]);
  130. }
  131. } else {
  132. me.fireEvent('data', me, Ext.create('Ext.direct.ExceptionEvent', {
  133. data: null,
  134. code: Ext.direct.Manager.self.exceptions.TRANSPORT,
  135. message: 'Unable to connect to the server.',
  136. xhr: response
  137. }));
  138. }
  139. }
  140. });