Giter Site home page Giter Site logo

bluejax.try's Introduction

Bluejax is a library that wraps jQuery's ajax function in Bluebird promises.

bluejax.try is the part of Bluejax that deals with retrying Ajax queries. This library does not wrap jQuery's ajax call in Bluebird promises. This makes it suitable to be used to implement query retry in cases where the code interfacing with it expects to work with a jqXHR object.

jQuery Versions Supported

In the 3.x and 2.x series: any version.

In the 1.x series: 1.11 or later. This being said, bluejax.try probably works fine with 1.9 and 1.10.

Platforms Supported

bluejax.try is tested on Chrome, Firefox, IE11 and 10, Edge, Opera, and Safari (on El Capitan, Yosemite, Mavericks). We test against the latest versions offered by the vendors of these browsers on their respective platforms.

The suite suite fails on IE9. I currently have no plans to work on adding support for IE9 but if you want to provide a pull request that will make bluejax.try run on IE9 and will keep its current tests passing, you are welcome to do so.

Browser Stack

Bluejax is tested using BrowserStack. BrowserStack provides this service for free under their program for supporting open-source software.

Loading bluejax.try

AMD

Your loader should be configured so that it can find jQuery.

CommonJS

Once installed, you should just be able to do var bluetry = require("bluejax.try"). jQuery should also be installed.

script elements

If you are just loading it in a browser with script. jQuery must have been loaded beforehand. Whether or not Bluejax is loaded too, bluejax.try will be available as root.bluejax.try (where root is whatever your global scope is).

Using bluejax.try

The module exports these items:

  • ajax(...) is a function that passes all its arguments to jQuery.ajax. By default, it returns a jqXHR-like object that will be successful if any of the tries is successful or will fail if all the tries fail.

  • make(options) is a utility function that creates a new ajax-like function. The options parameter is an object containing Bluejax options. (Only Bluejax options. It does not allow setting jQuery.ajax options.) The returned value is a new function that works like ajax but which has its Bluejax options set to the values contained in the options object.

  • perform is a function that is meant to be used from the main code of Bluejax. You should not need to use it.

  • extractBluejaxOptions this is another function meant to be used from the main code of Bluejax. You should not need to use it.

Options

bluejax.try currently supports these options:

  • tries tells bluejax.try to retry the query for a number of times. Note that the value here should be a number greater than 1. (Values less than 1 yield undefined behavior.)

  • shouldRetry is a function with the following signature shouldRetry(jqXHR, textStatus, errorThrown). It should return true if the query should be retried, or false if an error should be returned immediately.

    If no value is specified, the default function returns true if the previous query failed due to reasons other than the HTTP status code reporting an error, aborted or had a parser error. Basically, it retries the connection if the issue appears to be at the network level rather than an application issue.

  • delay specifies the delay between retries, in milliseconds.

There are two ways to set the options:

  • You can set set the bluejaxOptions field on a settings object passed to ajax. Remember that ajax(...) takes the same parameters as jQuery.ajax. For instance:

    bluejax.try.ajax({
        url: "http://example.com",
        bluejaxOptions: {
            tries: 3
        }
    });
    
  • You can create a new ajax-like function with make. For instance:

    var custom = bluetry.try.make({ tries: 3 });
    

    would create a function that would try a query 3 times by default so calling custom("http://example.com") would query http://example.com three times if the initial queries fail.

How it Works, and Limitations

(In the following we refer to the ajax call provided by bluejax.try as bluejax.try.ajax so as to clearly distinguish it from $.ajax.)

While bluejax.try.ajax is meant to be a drop-in replacement for a plain $.ajax call, there may be use-case scenarios that it cannot handle.

bluejax.try.ajax operates so that from the perspective of the immediate calling code, it behave as if only a single $.ajax call had been made. However, in reality it is possible that more than one $.ajax call will be made, depending on whether there are errors or not. It is not possible to simply return the jqXHR objects created by the $.ajax calls because these would be tied to the specific iteration in which they were created rather than the overall result of the whole operation. Besides, none of the jqXHR objects created after the 1st try are even available for being returned. So bluejax.try.ajax works by creating a "wrapper jqXHR" that is resolved or rejected depending on how the tries are resolved.

The wrapper jqXHR does not quite behave in the same way a regular jqXHR does. For instance, none of the global Ajax events that jQuery normally fires are fired for this wrapper. In a case where 3 tries are needed before succeess, we'd have three real calls to $.ajax, three jqXHR objects created and one wrapper. The global events would be fired 3 times for each call to $.ajax.

The wrapper also does not allow changing the parameters of an ajax request after bluejax.try.ajax returns. You could conceivably call setRequestHeader on the jqXHR object that $.ajax returns. Immediately after the call returns, it is probably still feasible to change headers. However bluejax.try.ajax does not support doing this or trying to change any of the parameters of the query. Specifically, you can call these methods on the object returned by bluejax.try.ajax:

  • getResponseHeader,

  • getAllResponseHeaders,

  • abort.

Each of these are dispatched to the "latest" jqXHR, i.e. the one that was created from the latest try. The other methods that are available on a jqXHR will result in a warning printed to the console and won't do what you are trying to do.

It is also possible to run into situations in which readyState changes on the wrapper in a way that makes no sense from the perspective of code that expects a regular jqXHR.

Developing bluejax.try

If you produce a pull request run gulp lint and gulp test first to make sure they run clean. If you add features, do add tests.

Coverage

We need a Mocha run to test loading this code as a CommonJS module with script elements. The Karma run, which exercises over 95% of the code, uses RequireJS to load it.

Ideally, we combine the results of the Karma runs with the result of the Mocha run. The problem though is that as we speak, karma-coverage uses Istanbul 0.4.x but to get coverage with Mocha with code that has run through Babel, we need Istanbul 1.0.0-alpha2 or higher. We've not been able to combine the formats produced by the various versions.

bluejax.try's People

Contributors

lddubeau avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

lachlanstuart

bluejax.try's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤ī¸ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.