Skip to content

Commit b4ba44b

Browse files
Merge pull request #59 from canjs/add-xhr-sync
Add async: false to can-ajax options
2 parents 3076536 + a3d00b7 commit b4ba44b

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

can-ajax-test.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,24 @@ if (hasLocalServer) {
5050
done();
5151
});
5252
});
53+
54+
QUnit.test("synchronous get request", function(assert) {
55+
var done = assert.async();
56+
var ok = true;
57+
ajax({
58+
type: "get",
59+
url: __dirname+"/can-ajax-test-result.json",
60+
async: false,
61+
success: function(){
62+
assert.ok(ok, "Callback happens before returning.");
63+
}
64+
}).then(function(){
65+
assert.ok(!ok, "Promise resolves after returning");
66+
done();
67+
});
68+
69+
ok = false;
70+
});
5371
}
5472

5573
QUnit.test("added to namespace (#99)", function (assert) {

can-ajax.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ var param = require("can-param");
4040
* - __crossDomain__ `{Boolean}` If you wish to force a crossDomain request (such as JSONP) on the same domain, set the value of crossDomain to true. This allows, for example, server-side redirection to another domain. Default: `false` for same-domain requests, `true` for cross-domain requests.
4141
* - __xhrFields__ `{Object}` Any fields to be set directly on the xhr request, [https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest] such as the withCredentials attribute that indicates whether or not cross-site Access-Control requests should be made using credentials such as cookies or authorization headers.
4242
* - __beforeSend__ `{callback}` A pre-request callback function that can be used to modify the XHR object before it is sent. Use this to set custom headers, etc. The XHR and settings objects are passed as arguments.
43-
*
43+
* - __success__ `{callback}` A callback passed the response body when the request completes without error. Using the promise returned from ajax() should be preferred to passing a success callback
44+
* - __error__ `{callback}` A callback passed the XHR object when the request fails to complete correctly. Using the promise returned from ajax() should be preferred to passing an error callback
45+
* - __async__ `{Boolean}` Set `async` to `false` to create a synchronous XHR that blocks the thread until the request completes. success() or error() is called synchronously on completion, but promise callbacks are still resolved asychronously. Synchronous AJAX calls are **not recommended** and are only supported here for legacy reasons.
46+
*
4447
* @return {Promise} A Promise that resolves to the data. The Promise instance is abortable and exposes an `abort` method. Invoking abort on the Promise instance indirectly rejects it.
4548
*
4649
*
@@ -155,6 +158,8 @@ function ajax(o) {
155158
return canReflect.assignDeep(a,b);
156159
});
157160

161+
var async = o.async !== false;
162+
158163
// Set the default contentType
159164
if(!o.contentType) {
160165
o.contentType = o.type.toUpperCase() === "GET" ?
@@ -217,7 +222,7 @@ function ajax(o) {
217222
if (!isPost && o.data) {
218223
url += "?" + (isJsonContentType ? JSON.stringify(o.data) : param(o.data));
219224
}
220-
xhr.open(type, url, true);
225+
xhr.open(type, url, async);
221226

222227
// For CORS to send a "simple" request (to avoid a preflight check), the following methods are allowed: GET/POST/HEAD,
223228
// see https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Simple_requests

0 commit comments

Comments
 (0)