From d8a2ab7cf348367020dd97f2b0e76749d8d9bddf Mon Sep 17 00:00:00 2001 From: Marco Braga Date: Fri, 9 Oct 2015 14:09:22 +0200 Subject: [PATCH] Fix retry not preserving original ajax options if context is specified --- dist/jquery.ajax-retry.js | 5 ++--- dist/jquery.ajax-retry.min.js | 2 +- src/jquery.ajax-retry.js | 5 ++--- test/jquery.ajax-retry_test.js | 18 ++++++++++++++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/dist/jquery.ajax-retry.js b/dist/jquery.ajax-retry.js index 5d57f60..2472661 100644 --- a/dist/jquery.ajax-retry.js +++ b/dist/jquery.ajax-retry.js @@ -27,18 +27,17 @@ if (opts.statusCodes) { this.statusCodes = opts.statusCodes; } - return this.pipe(null, pipeFailRetry(this, opts)); + return this.pipe(null, pipeFailRetry(this, opts, originalOptions)); }; }); // generates a fail pipe function that will retry `jqXHR` `times` more times - function pipeFailRetry(jqXHR, opts) { + function pipeFailRetry(jqXHR, opts, ajaxOptions) { var times = opts.times; var timeout = jqXHR.timeout; // takes failure data as input, returns a new deferred return function(input, status, msg) { - var ajaxOptions = this; var output = new $.Deferred(); var retryAfter = jqXHR.getResponseHeader('Retry-After'); diff --git a/dist/jquery.ajax-retry.min.js b/dist/jquery.ajax-retry.min.js index 3c5929f..542e700 100644 --- a/dist/jquery.ajax-retry.min.js +++ b/dist/jquery.ajax-retry.min.js @@ -1 +1 @@ -!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){function b(b,c){var d=c.times,e=b.timeout;return function(f){function g(){a.ajax(h).retry({times:d-1,timeout:c.timeout,statusCodes:c.statusCodes}).pipe(i.resolve,i.reject)}var h=this,i=new a.Deferred,j=b.getResponseHeader("Retry-After");return d>1&&(!b.statusCodes||a.inArray(f.status,b.statusCodes)>-1)?(j&&(e=isNaN(j)?new Date(j).getTime()-a.now():1e3*parseInt(j,10),(isNaN(e)||0>e)&&(e=b.timeout)),void 0!==e?setTimeout(g,e):g()):i.rejectWith(this,arguments),i}}a.ajaxPrefilter(function(a,c,d){d.retry=function(a){return a.timeout&&(this.timeout=a.timeout),a.statusCodes&&(this.statusCodes=a.statusCodes),this.pipe(null,b(this,a))}})}); \ No newline at end of file +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){function b(b,c,d){var e=c.times,f=b.timeout;return function(g,h,i){function j(){a.ajax(d).retry({times:e-1,timeout:c.timeout,statusCodes:c.statusCodes}).pipe(k.resolve,k.reject)}var k=new a.Deferred,l=b.getResponseHeader("Retry-After");return e>1&&(!b.statusCodes||a.inArray(g.status,b.statusCodes)>-1)?(l&&(f=isNaN(l)?new Date(l).getTime()-a.now():1e3*parseInt(l,10),(isNaN(f)||0>f)&&(f=b.timeout)),void 0!==f?setTimeout(j,f):j()):k.rejectWith(this,arguments),k}}a.ajaxPrefilter(function(a,c,d){d.retry=function(a){return a.timeout&&(this.timeout=a.timeout),a.statusCodes&&(this.statusCodes=a.statusCodes),this.pipe(null,b(this,a,c))}})}); \ No newline at end of file diff --git a/src/jquery.ajax-retry.js b/src/jquery.ajax-retry.js index 5d57f60..2472661 100644 --- a/src/jquery.ajax-retry.js +++ b/src/jquery.ajax-retry.js @@ -27,18 +27,17 @@ if (opts.statusCodes) { this.statusCodes = opts.statusCodes; } - return this.pipe(null, pipeFailRetry(this, opts)); + return this.pipe(null, pipeFailRetry(this, opts, originalOptions)); }; }); // generates a fail pipe function that will retry `jqXHR` `times` more times - function pipeFailRetry(jqXHR, opts) { + function pipeFailRetry(jqXHR, opts, ajaxOptions) { var times = opts.times; var timeout = jqXHR.timeout; // takes failure data as input, returns a new deferred return function(input, status, msg) { - var ajaxOptions = this; var output = new $.Deferred(); var retryAfter = jqXHR.getResponseHeader('Retry-After'); diff --git a/test/jquery.ajax-retry_test.js b/test/jquery.ajax-retry_test.js index de5e3d2..f42fc00 100644 --- a/test/jquery.ajax-retry_test.js +++ b/test/jquery.ajax-retry_test.js @@ -270,5 +270,23 @@ '{ "id": 12, "comment": "error!" }'); }); + + asyncTest('ajax options and context are preserved', 4, function() { + var testContextObject = { someContext:"forTest" }; + var def = $.ajax({url:"/test",data:{},type:"POST",context:testContextObject}); + def.retry({times:2}).then(function(data){ + ok(data.id === 12); + strictEqual(this, testContextObject); + start(); + }); + this.requests[0].respond(400, { "Content-Type": "application/json" }, + '{ "id": 13, "comment": "error!" }'); + this.requests[1].respond(200, { "Content-Type": "application/json" }, + '{ "id": 12, "comment": "Hey there" }'); + + ok(this.requests[0].method === 'POST'); + ok(this.requests[1].method === 'POST'); + + }); }(jQuery));