JSFiddle - React, Tailwind, and code Playground

by AndrewZhang

HTML

<div id="log"></div>
<button id="ajaxBtn" data-count="0">trigger ajax</button>
<button id="clearBtn">clear log</button>

JavaScript

;(function($) {
    $.ajaxQueue = {
        requests: new Array(),
        
        offer: function(options) {
            var _self = this,
               xhrOptions = $.extend({}, options, {
                   complete: function(jqXHR, textStatus) {
                       if($.isArray(options.complete)) {
                           var funcs = options.complete;
                           for(var i = 0, len = funcs.length; i < len; i++) 
                               funcs[i].call(this, jqXHR, textStatus);
                       } else {
                           if(options.complete)
                               options.complete.call(this, jqXHR, textStatus);            
                       }
                       _self.poll();
                   },
                   
                   beforeSend: function(jqXHR, settings) {
                       if(options.beforeSend)
                           var ret = options.beforeSend.call(this, jqXHR, settings);
                       if(ret === false) { 
                          // $('#log').append('<p>an ajax request cancelled</p>');
                           _self.poll();
                           return ret;
                       }
                   }
               });
            
            this.requests.push(xhrOptions);
            
            if(this.requests.length == 1) {
                $.ajax(xhrOptions);
            }
        },
        
        poll: function() {
            if(this.isEmpty()) {
                return null;    
            }
            
            var processedRequest = this.requests.shift();
            var nextRequest = this.peek();
            if(nextRequest != null) {
                $.ajax(nextRequest);
            }
            
            return processedRequest;
        },
        
        peek: function() {
            if(this.isEmpty()) {
                return null;
            }
            
            var nextRequest = this.requests[0];
            return...