|
22 | 22 | * An object with the following properties |
23 | 23 | * - url: URL of the request |
24 | 24 | * - jsonp: The named callback parameter for the JSONP call |
| 25 | + * - jsonpCallback: Callback to execute. For when the JSONP callback can't be changed |
25 | 26 | * |
26 | 27 | * @returns {Observable} A cold observable containing the results from the JSONP call. |
27 | 28 | */ |
28 | 29 | var getJSONPRequestCold = ajax.jsonpRequestCold = (function () { |
29 | | - var uniqueId = 0; |
30 | | - return function (settings) { |
31 | | - return new AnonymousObservable(function (observer) { |
| 30 | + var uniqueId = 0; |
| 31 | + var defaultCallback = function _defaultCallback(observer, data) { |
| 32 | + observer.onNext(data); |
| 33 | + observer.onCompleted(); |
| 34 | + }; |
32 | 35 |
|
33 | | - if (typeof settings === 'string') { |
34 | | - settings = { url: settings } |
35 | | - } |
36 | | - if (!settings.jsonp) { |
37 | | - settings.jsonp = 'JSONPCallback'; |
38 | | - } |
| 36 | + return function (settings) { |
| 37 | + return new AnonymousObservable(function (observer) { |
| 38 | + |
| 39 | + if (typeof settings === 'string') { |
| 40 | + settings = { url: settings }; |
| 41 | + } |
| 42 | + if (!settings.jsonp) { |
| 43 | + settings.jsonp = 'JSONPCallback'; |
| 44 | + } |
39 | 45 |
|
40 | | - var head = document.getElementsByTagName('head')[0] || document.documentElement, |
41 | | - tag = document.createElement('script'), |
42 | | - handler = 'rxjscallback' + uniqueId++; |
| 46 | + var head = document.getElementsByTagName('head')[0] || document.documentElement, |
| 47 | + tag = document.createElement('script'), |
| 48 | + handler = 'rxjscallback' + uniqueId++; |
| 49 | + |
| 50 | + var prevFn; |
| 51 | + if (typeof settings.jsonpCallback === 'string') { |
| 52 | + handler = settings.jsonpCallback; |
| 53 | + prevFn = root[handler]; |
| 54 | + } |
43 | 55 |
|
44 | | - settings.url = settings.url.replace('=' + settings.jsonp, '=' + handler); |
| 56 | + settings.url = settings.url.replace('=' + settings.jsonp, '=' + handler); |
45 | 57 |
|
46 | | - root[handler] = function (data) { |
47 | | - observer.onNext(data); |
48 | | - observer.onCompleted(); |
49 | | - }; |
| 58 | + root[handler] = function(data) { |
| 59 | + if (prevFn && typeof prevFn === 'function') { |
| 60 | + prevFn(observer, data); |
| 61 | + } else { |
| 62 | + defaultCallback(observer, data); |
| 63 | + } |
| 64 | + }; |
50 | 65 |
|
51 | | - tag.src = settings.url; |
52 | | - tag.async = true; |
53 | | - tag.onload = tag.onreadystatechange = function (_, abort) { |
54 | | - if ( abort || !tag.readyState || /loaded|complete/.test(tag.readyState) ) { |
55 | | - tag.onload = tag.onreadystatechange = null; |
56 | | - if (head && tag.parentNode) { |
57 | | - destroy(tag); |
58 | | - } |
59 | | - tag = undefined; |
60 | | - root[handler] = undefined; |
61 | | - delete root[handler]; |
62 | | - } |
63 | | - }; |
64 | | - head.insertBefore(tag, head.firstChild); |
| 66 | + var cleanup = function _cleanup() { |
| 67 | + tag.onload = tag.onreadystatechange = null; |
| 68 | + if (head && tag.parentNode) { |
| 69 | + destroy(tag); |
| 70 | + } |
| 71 | + tag = undefined; |
| 72 | + root[handler] = prevFn; |
| 73 | + }; |
65 | 74 |
|
66 | | - return function () { |
67 | | - if (!tag) { return; } |
68 | | - tag.onload = tag.onreadystatechange = null; |
69 | | - if (head && tag.parentNode) { |
70 | | - destroy(tag); |
71 | | - } |
72 | | - tag = undefined; |
73 | | - root[handler] = undefined; |
74 | | - delete root[handler]; |
75 | | - }; |
76 | | - }); |
77 | | - }; |
| 75 | + tag.src = settings.url; |
| 76 | + tag.async = true; |
| 77 | + tag.onload = tag.onreadystatechange = function (_, abort) { |
| 78 | + if ( abort || !tag.readyState || /loaded|complete/.test(tag.readyState) ) { |
| 79 | + cleanup(); |
| 80 | + } |
| 81 | + }; |
| 82 | + head.insertBefore(tag, head.firstChild); |
78 | 83 |
|
| 84 | + return function () { |
| 85 | + if (!tag) { return; } |
| 86 | + cleanup(); |
| 87 | + }; |
| 88 | + }); |
| 89 | + }; |
79 | 90 | })(); |
80 | 91 |
|
81 | 92 | /** |
|
0 commit comments