code: function (e, data) {
              var that = this,
                  getPromise = function (data) {
                      return $.Deferred().resolveWith(that, [data]).promise();
                  };
              data.process = function (resolveFunc, rejectFunc) {
                  if (resolveFunc || rejectFunc) {
                      data._processQueue = this._processQueue =
                          (this._processQueue || getPromise(this))
                              .pipe(resolveFunc, rejectFunc);
                  }
                  return this._processQueue || getPromise(this);
              };
              data.submit = function () {
                  if (this.state() !== 'pending') {
                      data.jqXHR = this.jqXHR =
                          (that._trigger('submit', e, this) !== false) &&
                              that._onSend(e, this);
                  }
                  return this.jqXHR || that._getXHRPromise();
              };
              data.abort = function () {
                  if (this.jqXHR) {
                      return this.jqXHR.abort();
                  }
                  return that._getXHRPromise();
              };
              data.state = function () {
                  if (this.jqXHR) {
                      return that._getDeferredState(this.jqXHR);
                  }
                  if (this._processQueue) {
                      return that._getDeferredState(this._processQueue);
                  }
              };
              data.progress = function () {
                  return this._progress;
              };
              data.response = function () {
                  return this._response;
              };
          }
docs: Adds convenience methods to the data callback argument: