Skip to content

Commit 3c4417f

Browse files
Allow xhr synchronous requests and fix #13
1 parent a557a23 commit 3c4417f

13 files changed

+149
-81
lines changed

DynamicsWebApi.njsproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
<OutputPath>.</OutputPath>
2727
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
2828
<ProjectTypeGuids>{3AF33F2E-1136-4D97-BBB7-1795711AC8B8};{349c5851-65df-11da-9384-00065b846f21};{9092AA53-FB77-4645-B42D-1CCCA6BD08BD}</ProjectTypeGuids>
29-
<ProjectView>ProjectFiles</ProjectView>
29+
<ProjectView>ShowAllFiles</ProjectView>
3030
<NodejsPort>1337</NodejsPort>
3131
<StartWebBrowser>True</StartWebBrowser>
3232
</PropertyGroup>

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -907,7 +907,7 @@ OData Annotation | Property Suffix
907907
Feature is very convenient for big Fetch XMLs. `Implemented in v.1.2.8`
908908
- [X] "Formatted" values in responses. For instance: Web API splits information about lookup fields into separate properties,
909909
the config option "formatted" will enable developers to retrieve all information about such fields in a single requests and access it through DynamicsWebApi custom response objects.
910-
- [X] Simplified names for "Formatted" properties. `Implemeted in v.1.3.0`
910+
- [X] Simplified names for "Formatted" properties. `Implemented in v.1.3.0`
911911
- [ ] Batch requests.
912912
- [ ] Web API Authentication for On-Premise instances.
913913
- [ ] Intellisense for request objects.

dist/dynamics-web-api-callbacks.js

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -354,9 +354,10 @@ function setStandardHeaders(additionalHeaders) {
354354
* @param {Object} config - DynamicsWebApi config.
355355
* @param {Object} [data] - Data to send in the request.
356356
* @param {Object} [additionalHeaders] - Object with additional headers. IMPORTANT! This object does not contain default headers needed for every request.
357+
* @param {boolean} [isAsync] - Indicates whether the request should be made synchronously or asynchronously.
357358
* @returns {Promise}
358359
*/
359-
module.exports = function sendRequest(method, uri, config, data, additionalHeaders, successCallback, errorCallback) {
360+
module.exports = function sendRequest(method, uri, config, data, additionalHeaders, successCallback, errorCallback, isAsync) {
360361

361362
if (!additionalHeaders) {
362363
additionalHeaders = {};
@@ -432,7 +433,7 @@ module.exports = function sendRequest(method, uri, config, data, additionalHeade
432433
additionalHeaders['Authorization'] = 'Bearer ' + token.accessToken;
433434
}
434435

435-
executeRequest(method, config.webApiUrl + uri, stringifiedData, additionalHeaders, successCallback, errorCallback);
436+
executeRequest(method, config.webApiUrl + uri, stringifiedData, additionalHeaders, successCallback, errorCallback, isAsync);
436437
};
437438

438439
//call a token refresh callback only if it is set and there is no "Authorization" header set yet
@@ -475,7 +476,7 @@ var buildPreferHeader = __webpack_require__(12);
475476
* @param {Object} [config] - DynamicsWebApi config
476477
* @returns {ConvertedRequestOptions}
477478
*/
478-
function convertRequestOptions (request, functionName, url, joinSymbol, config) {
479+
function convertRequestOptions(request, functionName, url, joinSymbol, config) {
479480
var headers = {};
480481
var requestArray = [];
481482
joinSymbol = joinSymbol != null ? joinSymbol : "&";
@@ -620,10 +621,19 @@ function convertRequest(request, functionName, config) {
620621

621622
var result = convertRequestOptions(request, functionName, url, '&', config);
622623

623-
if (result.query)
624+
if (result.query) {
624625
result.url += "?" + encodeURI(result.query);
626+
}
627+
628+
if (request.hasOwnProperty('async') && request.async != null) {
629+
ErrorHelper.boolParameterCheck(request.async, "DynamicsWebApi." + functionName, "request.async");
630+
result.async = request.async;
631+
}
632+
else {
633+
result.async = true;
634+
}
625635

626-
return { url: result.url, headers: result.headers };
636+
return { url: result.url, headers: result.headers, async: result.async };
627637
};
628638

629639
var RequestConverter = {
@@ -806,9 +816,10 @@ function DynamicsWebApi(config) {
806816
* @param {Function} errorCallback - A callback called when a request failed.
807817
* @param {Object} [data] - Data to send in the request.
808818
* @param {Object} [additionalHeaders] - Object with additional headers. IMPORTANT! This object does not contain default headers needed for every request.
819+
* @param {boolean} [isAsync] - Indicates whether the request should be made synchronously or asynchronously.
809820
*/
810-
var _sendRequest = function (method, uri, data, additionalHeaders, successCallback, errorCallback) {
811-
sendRequest(method, uri, _internalConfig, data, additionalHeaders, successCallback, errorCallback);
821+
var _sendRequest = function (method, uri, data, additionalHeaders, successCallback, errorCallback, isAsync) {
822+
sendRequest(method, uri, _internalConfig, data, additionalHeaders, successCallback, errorCallback, isAsync);
812823
}
813824

814825
/**
@@ -857,7 +868,7 @@ function DynamicsWebApi(config) {
857868
}
858869
}
859870

860-
_sendRequest("POST", result.url, object, result.headers, onSuccess, errorCallback);
871+
_sendRequest("POST", result.url, object, result.headers, onSuccess, errorCallback, result.async);
861872
};
862873

863874
/**
@@ -899,7 +910,7 @@ function DynamicsWebApi(config) {
899910
}
900911
};
901912

902-
_sendRequest("PATCH", result.url, request.entity, result.headers, onSuccess, onError);
913+
_sendRequest("PATCH", result.url, request.entity, result.headers, onSuccess, onError, result.async);
903914
}
904915

905916
/**
@@ -988,7 +999,7 @@ function DynamicsWebApi(config) {
988999
: successCallback();
9891000
};
9901001

991-
_sendRequest("PUT", result.url, { value: keyValue }, result.headers, onSuccess, errorCallback);
1002+
_sendRequest("PUT", result.url, { value: keyValue }, result.headers, onSuccess, errorCallback, result.async);
9921003
};
9931004

9941005
/**
@@ -1023,7 +1034,7 @@ function DynamicsWebApi(config) {
10231034
}
10241035
};
10251036

1026-
_sendRequest("DELETE", result.url, null, result.headers, onSuccess, onError);
1037+
_sendRequest("DELETE", result.url, null, result.headers, onSuccess, onError, result.async);
10271038
}
10281039

10291040
/**
@@ -1056,7 +1067,7 @@ function DynamicsWebApi(config) {
10561067
successCallback();
10571068
};
10581069

1059-
_sendRequest("DELETE", url, null, null, onSuccess, errorCallback);
1070+
_sendRequest("DELETE", url, null, null, onSuccess, errorCallback, true);
10601071
};
10611072

10621073
/**
@@ -1085,7 +1096,7 @@ function DynamicsWebApi(config) {
10851096
}
10861097
};
10871098

1088-
_sendRequest("GET", result.url, null, result.headers, onSuccess, errorCallback);
1099+
_sendRequest("GET", result.url, null, result.headers, onSuccess, errorCallback, result.async);
10891100
}
10901101

10911102
/**
@@ -1174,7 +1185,7 @@ function DynamicsWebApi(config) {
11741185
}
11751186
};
11761187

1177-
_sendRequest("PATCH", result.url, request.entity, result.headers, onSuccess, onError);
1188+
_sendRequest("PATCH", result.url, request.entity, result.headers, onSuccess, onError, result.async);
11781189
}
11791190

11801191
/**
@@ -1344,7 +1355,7 @@ function DynamicsWebApi(config) {
13441355
successCallback(response.data);
13451356
};
13461357

1347-
_sendRequest("GET", result.url, null, result.headers, onSuccess, errorCallback);
1358+
_sendRequest("GET", result.url, null, result.headers, onSuccess, errorCallback, result.async);
13481359
}
13491360

13501361
this.retrieveMultipleRequest = retrieveMultipleRequest;
@@ -1438,7 +1449,7 @@ function DynamicsWebApi(config) {
14381449
successCallback(response.data);
14391450
};
14401451

1441-
_sendRequest("GET", result.url + "?fetchXml=" + encodedFetchXml, null, result.headers, onSuccess, errorCallback);
1452+
_sendRequest("GET", result.url + "?fetchXml=" + encodedFetchXml, null, result.headers, onSuccess, errorCallback, result.async);
14421453
}
14431454

14441455
this.fetch = this.executeFetchXml = executeFetchXml;
@@ -1935,9 +1946,9 @@ var parseResponseHeaders = __webpack_require__(9);
19351946
* @param {string} [data] - Data to send in the request.
19361947
* @param {Object} [additionalHeaders] - Object with headers. IMPORTANT! This object does not contain default headers needed for every request.
19371948
*/
1938-
var xhrRequest = function (method, uri, data, additionalHeaders, successCallback, errorCallback) {
1949+
var xhrRequest = function (method, uri, data, additionalHeaders, successCallback, errorCallback, async) {
19391950
var request = new XMLHttpRequest();
1940-
request.open(method, uri, true);
1951+
request.open(method, uri, async);
19411952
//request.setRequestHeader("OData-MaxVersion", "4.0");
19421953
//request.setRequestHeader("OData-Version", "4.0");
19431954
//request.setRequestHeader("Accept", "application/json");

dist/dynamics-web-api-callbacks.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/dynamics-web-api.js

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -354,9 +354,10 @@ function setStandardHeaders(additionalHeaders) {
354354
* @param {Object} config - DynamicsWebApi config.
355355
* @param {Object} [data] - Data to send in the request.
356356
* @param {Object} [additionalHeaders] - Object with additional headers. IMPORTANT! This object does not contain default headers needed for every request.
357+
* @param {boolean} [isAsync] - Indicates whether the request should be made synchronously or asynchronously.
357358
* @returns {Promise}
358359
*/
359-
module.exports = function sendRequest(method, uri, config, data, additionalHeaders, successCallback, errorCallback) {
360+
module.exports = function sendRequest(method, uri, config, data, additionalHeaders, successCallback, errorCallback, isAsync) {
360361

361362
if (!additionalHeaders) {
362363
additionalHeaders = {};
@@ -432,7 +433,7 @@ module.exports = function sendRequest(method, uri, config, data, additionalHeade
432433
additionalHeaders['Authorization'] = 'Bearer ' + token.accessToken;
433434
}
434435

435-
executeRequest(method, config.webApiUrl + uri, stringifiedData, additionalHeaders, successCallback, errorCallback);
436+
executeRequest(method, config.webApiUrl + uri, stringifiedData, additionalHeaders, successCallback, errorCallback, isAsync);
436437
};
437438

438439
//call a token refresh callback only if it is set and there is no "Authorization" header set yet
@@ -475,7 +476,7 @@ var buildPreferHeader = __webpack_require__(12);
475476
* @param {Object} [config] - DynamicsWebApi config
476477
* @returns {ConvertedRequestOptions}
477478
*/
478-
function convertRequestOptions (request, functionName, url, joinSymbol, config) {
479+
function convertRequestOptions(request, functionName, url, joinSymbol, config) {
479480
var headers = {};
480481
var requestArray = [];
481482
joinSymbol = joinSymbol != null ? joinSymbol : "&";
@@ -620,10 +621,19 @@ function convertRequest(request, functionName, config) {
620621

621622
var result = convertRequestOptions(request, functionName, url, '&', config);
622623

623-
if (result.query)
624+
if (result.query) {
624625
result.url += "?" + encodeURI(result.query);
626+
}
627+
628+
if (request.hasOwnProperty('async') && request.async != null) {
629+
ErrorHelper.boolParameterCheck(request.async, "DynamicsWebApi." + functionName, "request.async");
630+
result.async = request.async;
631+
}
632+
else {
633+
result.async = true;
634+
}
625635

626-
return { url: result.url, headers: result.headers };
636+
return { url: result.url, headers: result.headers, async: result.async };
627637
};
628638

629639
var RequestConverter = {
@@ -804,11 +814,12 @@ function DynamicsWebApi(config) {
804814
* @param {string} uri - Request URI.
805815
* @param {Object} [data] - Data to send in the request.
806816
* @param {Object} [additionalHeaders] - Object with additional headers. IMPORTANT! This object does not contain default headers needed for every request.
817+
* @param {boolean} [isAsync] - Indicates whether the request should be made synchronously or asynchronously.
807818
* @returns {Promise}
808819
*/
809-
var _sendRequest = function (method, uri, data, additionalHeaders) {
820+
var _sendRequest = function (method, uri, data, additionalHeaders, isAsync) {
810821
return new Promise(function (resolve, reject) {
811-
sendRequest(method, uri, _internalConfig, data, additionalHeaders, resolve, reject);
822+
sendRequest(method, uri, _internalConfig, data, additionalHeaders, resolve, reject, isAsync);
812823
});
813824
};
814825

@@ -841,7 +852,7 @@ function DynamicsWebApi(config) {
841852

842853
var result = RequestConverter.convertRequest(request, "create", _internalConfig);
843854

844-
return _sendRequest("POST", result.url, object, result.headers)
855+
return _sendRequest("POST", result.url, object, result.headers, result.async)
845856
.then(function (response) {
846857
if (response.data) {
847858
return response.data;
@@ -868,7 +879,7 @@ function DynamicsWebApi(config) {
868879

869880
//copy locally
870881
var select = request.select;
871-
return _sendRequest("GET", result.url, null, result.headers).then(function (response) {
882+
return _sendRequest("GET", result.url, null, result.headers, result.async).then(function (response) {
872883
if (select != null && select.length == 1 && select[0].endsWith("/$ref") && response.data["@odata.id"] != null) {
873884
return Utility.convertToReferenceObject(response.data);
874885
}
@@ -929,7 +940,7 @@ function DynamicsWebApi(config) {
929940

930941
//copy locally
931942
var ifmatch = request.ifmatch;
932-
return _sendRequest("PATCH", result.url, request.entity, result.headers)
943+
return _sendRequest("PATCH", result.url, request.entity, result.headers, result.async)
933944
.then(function (response) {
934945
if (response.data) {
935946
return response.data;
@@ -1021,7 +1032,7 @@ function DynamicsWebApi(config) {
10211032

10221033
var result = RequestConverter.convertRequest(request, "updateSingleProperty", _internalConfig);
10231034

1024-
return _sendRequest("PUT", result.url, { value: keyValue }, result.headers)
1035+
return _sendRequest("PUT", result.url, { value: keyValue }, result.headers, result.async)
10251036
.then(function (response) {
10261037
if (response.data) {
10271038
return response.data;
@@ -1043,7 +1054,7 @@ function DynamicsWebApi(config) {
10431054

10441055
//copy locally
10451056
var ifmatch = request.ifmatch;
1046-
return _sendRequest("DELETE", result.url, null, result.headers).then(function () {
1057+
return _sendRequest("DELETE", result.url, null, result.headers, result.async).then(function () {
10471058
return true; //deleted
10481059
}).catch(function (error) {
10491060
if (ifmatch && error.status == 412) {
@@ -1079,7 +1090,7 @@ function DynamicsWebApi(config) {
10791090
if (propertyName != null)
10801091
url += "/" + propertyName;
10811092

1082-
return _sendRequest("DELETE", url).then(function () {
1093+
return _sendRequest("DELETE", url, null, null, true).then(function () {
10831094
return;
10841095
})
10851096
};
@@ -1100,7 +1111,7 @@ function DynamicsWebApi(config) {
11001111
//copy locally
11011112
var ifnonematch = request.ifnonematch;
11021113
var ifmatch = request.ifmatch;
1103-
return _sendRequest("PATCH", result.url, request.entity, result.headers)
1114+
return _sendRequest("PATCH", result.url, request.entity, result.headers, result.async)
11041115
.then(function (response) {
11051116
if (response.headers['OData-EntityId'] || response.headers['odata-entityid']) {
11061117
var entityUrl = response.headers['OData-EntityId']
@@ -1186,7 +1197,7 @@ function DynamicsWebApi(config) {
11861197
//copy locally
11871198
var toCount = request.count;
11881199

1189-
return _sendRequest("GET", result.url, null, result.headers)
1200+
return _sendRequest("GET", result.url, null, result.headers, result.async)
11901201
.then(function (response) {
11911202

11921203
if (toCount) {
@@ -1355,7 +1366,7 @@ function DynamicsWebApi(config) {
13551366

13561367
var encodedFetchXml = encodeURIComponent(fetchXml);
13571368

1358-
return _sendRequest("GET", result.url + "?fetchXml=" + encodedFetchXml, null, result.headers)
1369+
return _sendRequest("GET", result.url + "?fetchXml=" + encodedFetchXml, null, result.headers, result.async)
13591370
.then(function (response) {
13601371

13611372
if (response.data['@' + DWA.Prefer.Annotations.FetchXmlPagingCookie] != null) {
@@ -1817,9 +1828,9 @@ var parseResponseHeaders = __webpack_require__(9);
18171828
* @param {string} [data] - Data to send in the request.
18181829
* @param {Object} [additionalHeaders] - Object with headers. IMPORTANT! This object does not contain default headers needed for every request.
18191830
*/
1820-
var xhrRequest = function (method, uri, data, additionalHeaders, successCallback, errorCallback) {
1831+
var xhrRequest = function (method, uri, data, additionalHeaders, successCallback, errorCallback, async) {
18211832
var request = new XMLHttpRequest();
1822-
request.open(method, uri, true);
1833+
request.open(method, uri, async);
18231834
//request.setRequestHeader("OData-MaxVersion", "4.0");
18241835
//request.setRequestHeader("OData-Version", "4.0");
18251836
//request.setRequestHeader("Accept", "application/json");

dist/dynamics-web-api.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)