code: function updateHandler(eventToHandle, attrToParse, btnEl) {
            // we need to use evalAsync here, as
            // otherwise the click or submit event
            // won't be ready to be replaced
            var callbacks = getCallbacks(attrs[attrToParse]);
  
            // unbind original click event
            el.off(eventToHandle);
  
            // rebind, but this time watching it's return value
            el.on(eventToHandle, function (event) {
              // Make sure we run the $digest cycle
              scope.$apply(function () {
                callbacks.forEach(function (cb) {
                  // execute function on parent scope
                  // as we're in an isolate scope here
                  var promise = cb(scope.$parent, {
                    $event: event
                  });
  
                  // only init watcher if not done before
                  if (!promiseWatcher) {
                    promiseWatcher = initPromiseWatcher(function () {
                      return promise;
                    }, btnEl);
                  }
                });
              });
            });
          }
docs: Used for the function syntax of the promise button directive by
  parsing the expressions provided by the attribute via getCallbacks().
  Unbinds the default event handlers, which is why it might sometimes
  be required to use the promise syntax.
  @param {Object}eventToHandle
  @param {String}attrToParse
  @param {Object}btnEl