sainture
12/15/2016 - 9:38 PM

Deferred Object

Deferred Object

/*
you can create your own long running operations and allow other developers to register
event handlers.

Deferred object is used to manage long running operations and raise events on completion, 
failure etc


Background:
ECMAScript 2015 (a.k.a. ECMAScript 6) introduced a native means to deal with such situations:promises
jQuery provided and still provides its own flavor of promises, called Deferred objects. 
They were introduced to jQuery years before promises were introduced to ECMAScript

*/
// Background script
function LongRunningScript() {
 //1. create a deferred object
 var deferred = $.Deferred();

 //2. run your async operation
  
  // call resolve for success
  deferred.resolve();

  // call reject for failure
  deferred.reject();

 //3. return a promise
 return deferred.promise();

}
// Actual script
var promise = LongRunningScript();

promise.done(function() {
  // do something
});


// ANOTHER EXAMPLE
function timeout(milliseconds) {
  // Create a new Deferred object
  var deferred = $.Deferred();

  // Resolve the Deferred after the amount of time specified by milliseconds
  setTimeout(deferred.resolve, milliseconds);
     // here we didn't do deferred.resolve(), because setTimeout does that after specified milliseconds

  // Return the Deferred's Promise object
  return deferred.promise();
}

timeout(1000).then(function() {
  console.log('I waited for 1 second!');
});

// you can directly use 'then' on Ajax methods
$.getJSON('https://api.github.com/user/' + username + '/repositories')
  .then(function(repositories) {
    return repositories[0].name;
  });