Promise-based Operations
SpRestLib exclusively utilizes JavaScript ES6 Promises for asynchronous SharePoint operations.
(New) ES6/ES2015 Promises vs (Old) Callbacks
SpRestLib asynchronous methods return Promises, which provide two main benefits:
- No more callback functions
- No more managing async operations
If you're unfamiliar with the new ES6 Promise functionality, you may want to the a moment to read more about them. They really are a game changer for those of us who deal with asynchronous operations.
All major browsers (and Node.js) now fully support ES6 Promises, so keep reading to see them in action.
tl;dr
Promises can be chained using then()
or grouped using Promise.all()
so callbacks and queue management
are a thing of the past.
Async Chaining
- Promises can be chained so they execute in the order shown only after the previous one has completed
Example Logic
- SpRestLib methods return a Promise, meaning the "return sprestlib" calls below cause the subsequent
.then()
to wait for that method's REST call to return a result - That's all you need to code to enable chaining of asynchronous operations without any callback functions or queue management!
Example Code
var item = {
EmpName: 'Marty McFly',
EmpNumb: 1001,
HireDate: new Date()
};
Promise.resolve()
.then(function() { return sprLib.list('Employees').create(item); })
.then(function(item){ return sprLib.list('Employees').update(item); })
.then(function(item){ return sprLib.list('Employees').delete(item); })
.then(function(item){
console.log('Success! An item navigated the entire CRUD chain!');
});
Async Grouping
- Promises can be grouped using
.all()
meaning each of them must complete before.then()
is executed.
Example Logic
- This example requires that both the user info and user group queries complete before we move on
- The old AJAX callback method model required a lot more code to do this very thing!
Example Code
Promise.all([
sprLib.user().info(),
sprLib.user().groups()
])
.then(function(arrResults){
// 'arrResults' holds the return values of both method calls above - in the order they were provided
// Therefore, arrResults[0] holds user info() and arrResults[1] holds user groups()
console.log( "Current User Info `Title`: " + arrResults[0].Title );
console.log( "Current User Groups count: " + arrResults[1].length );
});