How to execute an asynchronous function in Teamsware actions or any other expression configuration?

How to execute an asynchronous function in Teamsware actions or any other expression configuration?

Description

If you need to wait for callbacks in Teamsware actions or other expression configurations before processing further, it's recommended using jQuery.Deferred() object.

The following code snippet demonstrates how to achieve this:

var deferrer = jQuery.Deferred(); //new deferred object is created.
window.setTimeout(function () {
deferrer.resolve(); //Resolve the deferred. Then e.g. next predefined Rich Form's actions will start to execute.
}, 10000);
return deferrer.promise(); //returns promise object

 

Example

After a new item is added you want to update its permissions and allows only Approver to edit this item.

In order to achieve this, open a new form in solution studio and add new action Execute Script after Save Form action for Save button:

New Form

 

Javascript code for Execute Script (Update Permissions) action:

var deferrer = jQuery.Deferred();

var ctx = SP.ClientContext.get_current();
var web = ctx.get_web();
var list = web.get_lists().getByTitle("DemoList");
var item = list.getItemById([[ID]]);
var approver = web.ensureUser([[Approver.LoginName]]);

//Break permission inheritance and clear existing permission rules.
item.breakRoleInheritance(false,true);

var itemAssignments = item.get_roleAssignments();

//Set read-only permisisons for site default groups
var roleDefBindingsReader = SP.RoleDefinitionBindingCollection.newObject(ctx);
roleDefBindingsReader.add(web.get_roleDefinitions().getByType(SP.RoleType.reader));
itemAssignments.add(web.get_associatedVisitorGroup(), roleDefBindingsReader);
itemAssignments.add(web.get_associatedMemberGroup(), roleDefBindingsReader);
itemAssignments.add(web.get_associatedOwnerGroup(), roleDefBindingsReader);

//Allow Approver to edit the item
var roleDefBindingsApprover = SP.RoleDefinitionBindingCollection.newObject(ctx);
roleDefBindingsApprover.add(ctx.get_web().get_roleDefinitions().getByType(SP.RoleType.contributor));
itemAssignments.add(approver, roleDefBindingsApprover);

ctx.executeQueryAsync(function() {
deferrer.resolve();
}, function(sender, args){
deferrer.reject("Failed to update item permissions: " + args.get_message())
});

return deferrer.promise();

 

Execute Script (Update Permissions) action


    • Related Articles

    • Teamsware Studio API Deployment

      Note: To use the Teamsware API deployment check your tenant settings and allow custom app authentication as described here What is API deployment API deployment is a type of publishing, that allows starting deployment process with HTTP call ...
    • Import Package Configuration (Solution Merge)

      Import Package Configuration (Solution Merge) Import Package Configuration (Solution Merge) feature gives the possibility to import (merge) configuration from another solution into the current one. If you've built a solution, you may want to use some ...
    • Teamsware Studio Update 07.12.2023

      New features Import Package Configuration (Solution Merge) Import Package Configuration (Solution Merge) feature gives the possibility to import (merge) configuration from another solution into the current one. The Import Package Configuration ...
    • Teamsware Studio Update 28.09.2023

      Bug fixes & improvements Modern Forms Version 1.3.34 Supported list form configuration per Content Type Added Content Type field to the form for changing Content types There is a new option for export all Content types Fix: opening customized forms ...
    • Teamsware Studio Update 11.04.2024

      New features Create shared link action Added Create shared link action for Scheduled & Triggered Actions Bug fixes & improvements Modern Forms Version 1.3.52 Fixed Add list item action for the case when column is deleted from the list Supported .js ...