on master help sign in
Make sure that HTTP responses are sent immediately but delivered sequentially.
d71f7a4evancz
core-js/Signal/HTTP.js+27−14
@@ -14,21 +14,35 @@ Elm.HTTP = function() {
14 function post(url) { return function(data) {
14 function post(url) { return function(data) {
15 return request("POST")(url)(data)(["Nil"]); }; }
15 return request("POST")(url)(data)(["Nil"]); }; }
16
16
17− function sendReq(responses) { return function(req) {
17+ function registerReq(queue,responses) { return function(req) {
18+ if (req.url !== "") { sendReq(queue,responses,req); }
19+ };
20+ }
21+
22+ function updateQueue(queue,responses) {
23+ if (queue.length > 0) {
18− Dispatcher.notify(responses.id,["Waiting"]);
24+ Dispatcher.notify(responses.id, queue[0].value);
25+ if (queue[0].value[0] !== "Waiting") {
26+ queue.shift();
27+ setTimeout(function() { updateQueue(queue,responses); }, 0);
28+ }
29+ }
30+ }
31+
32+ function sendReq(queue,responses,req) {
33+ var response = { value: ["Waiting"] };
34+ queue.push(response);
35+
19 var request = null;
36 var request = null;
20− if (window.XMLHttpRequest) {
21− request = new XMLHttpRequest();
22− } else if (window.ActiveXObject) {
23− request = new ActiveXObject("Microsoft.XMLHTTP");
37+ if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }
24− }
38+ if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }
25 request.onreadystatechange = function(e) {
39 request.onreadystatechange = function(e) {
26 if (request.readyState === 4) {
40 if (request.readyState === 4) {
27− Dispatcher.notify(
28− responses.id,
29− request.status === 200
41+ response.value = (request.status === 200
30− ? ["Success", toElmString(request.responseText)]
42+ ? ["Success", toElmString(request.responseText)]
43+ : ["Failure", request.status,
31− : ["Failure", request.status, toElmString(request.statusText)]);
44+ toElmString(request.statusText)]);
45+ setTimeout(function() { updateQueue(queue,responses); }, 0);
32 }
46 }
33 };
47 };
34 request.open(req.verb, req.url, true);
48 request.open(req.verb, req.url, true);
@@ -39,12 +53,11 @@ Elm.HTTP = function() {
39 })(req.headers);
53 })(req.headers);
40 request.send(req.data);
54 request.send(req.data);
41 return null;
55 return null;
42− };
43 }
56 }
44
57
45 function send(requests) {
58 function send(requests) {
46 var responses = Elm.Signal.constant(["Waiting"]);
59 var responses = Elm.Signal.constant(["Waiting"]);
47− var sender = Elm.Signal.lift(sendReq(responses))(requests);
60+ var sender = Elm.Signal.lift(registerReq([],responses))(requests);
48 function f(x) { return function(y) { return x; } }
61 function f(x) { return function(y) { return x; } }
49 var combine = Elm.Signal.lift2(f)(responses)(sender);
62 var combine = Elm.Signal.lift2(f)(responses)(sender);
50 return combine;
63 return combine;