You can use JavaScript call backs or Promises/deferreds to work synchronously with JavaScript client object model.
CallBack Example:
$(document).ready(function () {
//don't exectute any jsom until sp.js file has loaded.
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', prepareTables);
});
function prepareTables() {
getItemsWithCaml('External User Account Request',
function (camlItems) {
var listItemEnumerator = camlItems.getEnumerator();
while (listItemEnumerator.moveNext()) {
var listItem = listItemEnumerator.get_current();
console.log(listItem.get_item('Title'));
} console.log('Completed table prparation.');
},
function (sender, args) {
console.log('An error occured while retrieving list items:' + args.get_message());
});
}
function getItemsWithCaml(listTitle, success, error) {
var clientContext = new SP.ClientContext.get_current();
var list = clientContext.get_web().get_lists().getByTitle(listTitle);
var camlQuery = new SP.CamlQuery();
var camlItems = list.getItems(camlQuery);
clientContext.load(camlItems);
clientContext.executeQueryAsync(
function () {
success(camlItems);
},
error
);
};
Promises Example
$(document).ready(function () {
//don't exectute any jsom until sp.js file has loaded.
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', prepareTables);
});
function prepareTables() {
getItemsWithCaml('External User Account Request').then(
function (camlItems) {
var listItemEnumerator = camlItems.getEnumerator();
while (listItemEnumerator.moveNext()) {
var listItem = listItemEnumerator.get_current();
console.log(listItem.get_item('Title'));
} console.log('Completed table prparation.');
},
function (sender, args) {
console.log('An error occured while retrieving list items:' + args.get_message());
}
);
}
function getItemsWithCaml(listTitle) {
//use of $.Deferred in the executeQueryAsync delegate allows the consumer of this method to write 'syncronous like' code
var deferred = $.Deferred();
var clientContext = new SP.ClientContext.get_current();
var list = clientContext.get_web().get_lists().getByTitle(listTitle);
var camlQuery = new SP.CamlQuery();
var items = list.getItems(camlQuery);
clientContext.load(items);
clientContext.executeQueryAsync(
Function.createDelegate(this,
function () { deferred.resolve(items); }),
Function.createDelegate(this,
function (sender, args) { deferred.reject(sender, args); }));
return deferred.promise();
};
Check this for more information: http://www.sharepointnadeem.com/2014/10/sharepoint-using-deferredspromises-or.html