If you’re a SharePoint developer and not using the SharePoint PnP JavaScript Core Library… you’re working too hard.
In an earlier blog post, I looked at Typescript’s asynch/await feature as a way to simplify asynchronous SharePoint code. In retrospect, the SharePoint PnP JavaScript Core Library is a better, simpler, more elegant solution.
We’ve all been here… deciding to drop what works… in favor of risking something better. For SharePoint client-side asynchronous code… this was an easy decision. Here’s a short snippet to illustrate the point:
static GetRoles ()
{
let deferred = $.Deferred();
// Get the groups the current user belongs to.
//
$.ajax({
url: _spPageContextInfo.webAbsoluteUrl +
"/_api/web/currentuser/Groups?$select=Title",
method: "GET",
headers: {"accept": "application/json;odata=verbose"},
success: function (resultsData)
{
deferred.resolve(resultsData.d.results);
},
error: function (jqXHR, textStatus, errorThrown)
{
window.console.log('error: loggedInUser.GetRoles returned an error');
deferred.reject();
}
});
return deferred.promise();
}
:
:
let promise1 = GetRoles();
:
$.when (promise1).done(function(data1)
{
processRoles (data1);
The GetRoles function make an asynch call into SharePoint, returning a promise, and the results are processed later. The GetRoles function is loaded with (typical) ugly asynch artifacts.
$pnp.sp.web.siteUsers.getById(_spPageContextInfo.userId).groups.select("Title").get()
.then ( groups=>
{
for (let group of groups)
{
// process groups...
Wow… the GetRoles function is reduced to a one-liner… with low-level asynch plumbing out of sight. I found that stringing multiple asynch calls together in parallel or serial fashion was easy, too.
I took the PnP code snippet above from a “traditional CSR” SharePoint list form… where the PnP library was “included” via this JSLink expression:
https://cdnjs.cloudflare.com/ajax/libs/sp-pnp-js/3.0.2/pnp.min.js
I used the dollar sign, like this: “$pnp” to reference the PnP library in my (non-React) TypeScript code.
But in my React components, I import the PnP library like this:
import pnp from "sp-pnp-js";