Deferred Object

A deferred object is like a callbacks list except that once a deferred object is resolvedor rejected, all functions in it cannot be invoked again. If the deferred object merely notifies, the functions may still be invoked.

Deferred Object
$.Deferred([function(DObject do) f])
Return a deferred object. The function f() is called just before the constructor returns.

deferred.state()
Return a string that can be 'pending', 'resolved', or 'rejected'.
deferred.done(function()[]/function(...) f1
[,function()[]/function(...) f2])Add handlers to be called when the deferred object is resolved.

deferred.fail(function()[]/function(...) f1
[,function()[]/function(...) f2])Add handlers to be called when the deferred object is rejected.deferred.always(function()[]/function(...) f1
[,function()[]/function(...) f2])
Add handlers to be called when the deferred object is resolved or rejected.deferred.progress(function()[]/function(...) f)
Add handlers to be called when the deferred object generates progress notifications.
deferred.then(function(...) done [,function(...) fail]
[,function(...) progress])
Add handlers to be called when the deferred object is resolved, rejected, or still in progress.Deferred.catch(function() fail)Add handlers to be called when the Deferred object is rejected.
deferred.resolve([Any args])
deferred.resolveWith(Object context [,Array args])
Resolve by calling functions registered with .done(...),
.always(...), and .then(...).
deferred.reject([Any args])
deferred.rejectWith(Object context [,Array args])
Reject by calling functions registered with .fail(...),
.always(...), and .then(...).
deferred.notify([Any args])deferred.notifyWith(Object context [,Array args])
Notify by calling functions registered with .progress(...) and .then(...).
A Promise object is a deferred object without the six functions that can change the state of the deferred object, as outlined in the previous row in this table. Note that the jqXHR object returned by $.ajax(...) is a Promise object.

deferred.promise([Object target])
Return a Promise object. If 'target' is provided, methods will be attached to it, and this object (instead of a new object) will be returned.
$.when(Deffered/Object deferreds)
Return a Promise object. If 'deferreds' is not a Deferred or a Promise, it will be treated as a resolved Deferred and any .done() callbacks attached will be executed immediately, with 'deferreds' as the argument.

RESETRUNFULL
<!DOCTYPE html><html><head>
   <script src="jquery-3.5.1.min.js"></script></head><body>
   <p></p>
   <script>
    function f1(){alert(1);}
   function f2(){alert(2);}
   function f3(){alert(3);}
   function f4(){alert(4);}
   var dO = $.Deferred(function(d){
                              this.f5 = function(){alert(5);};
                              d.f6 = function(){alert(6);}});
   dO.f5(); // 5
   dO.f6(); // 6
   dO.done([f1,f2]);
   dO.then(f1,f3,f4);
   dO.notify();  // 4
   dO.notify();  // 4
   alert(dO.state());  // pending
   dO.resolve();  // 1
  2
  1
   dO.resolve();  // (nothing)
   dO.reject();  // (nothing)
   dO.notify();  // (nothing)
   </script> </body></html>

RESETRUNFULL
<!DOCTYPE html><html><head>
   <script src="jquery-3.5.1.min.js"></script></head><body>
   <p></p>
   <script>
    function f1(msg){alert('1'+msg);}
   function f2(msg){alert('2'+msg);}
      var dO = $.Deferred();
   dO.done(f1);
   var pO1 = dO.promise();
   pO1.done(f1);   //pO1.resolve('X'); // (error)
   dO.resolve('X'); // 1X
  1X
      var pO2 = $.when(dO);
   pO1.done(f2);
   dO.resolve('Y'); // 2X
      var pO3 = $.when({a:10},{b:20},{c:30});
   dO.reject(f1);  // (nothing)
   dO.done(f2);  // 2X
   </script> </body></html>