Элегантно передавая «событие клика» через несколько обратных вызовов - PullRequest
5 голосов
/ 11 сентября 2010

Когда не авторизованный пользователь нажимает на данную кнопку, я хочу остановить событие, собрать его oauth, собрать его электронную почту, если у меня его нет, и затем выполнить событие.

Я хочу сделать все в javascript, потому что это сделает вещи намного проще.

Вот как я его выполняю, и у меня есть 2 вопроса:

  1. Есть ли более элегантный способ выполнения многоуровневых обратных вызовов?
  2. Способ, которым яЯ запускаю событие в конце, кажется хакерским.Что может быть лучшим способом сделать это?
  jQuery("a.callbacktesting").click(function(event){

    if (success==false){
      event.preventDefault();
      event.stopImmediatePropagation();
      authentication({endevent:event,followup:afterEmail},collectEmail, failFn);
    }
  });

  //1st level function
  function authentication(params, successFn, failFn){
      if (success=true){
        successFn(params,params.followup,failFn);
      }else{
       failFn();
      }      
  }

  //2nd level function
  function collectEmail(params, successFn, failFn){
      console.log("Collecting email");
      if (success=true){
        successFn(params);
      }else{
       failFn();
      };
  }

  //After everything is done, you want to execute this
  function afterEmail(params){
    jele=$(params.endevent.currentTarget)
    action=params.endevent.type
    jele.trigger(action);
  }

Ответы [ 2 ]

1 голос
/ 30 сентября 2010

Что с этим:

if (success = true) {

Вы понимаете, что устанавливает глобальную переменную "success" в true, правильно? Если вы хотите определить, равна ли переменная «success» значению true, используйте это:

if (success === true) {

Обратите внимание на 3 одинаковых знака.

Делая строгий перевод вашего кода, я получил такой результат:

//After everything is done, you want to execute this
function afterEmail(event) {
    $(event.currentTarget).trigger(event.type);
}

//2nd level function
function collectEmail(event) {
    console.log("Collecting email");
    if (success === true){
        afterEmail(event);
    } else {
        failFn();
    }
}

//1st level function
function authentication(event) {
    if (success === true) {
        collectEmail(event);
    } else {
        failFn();
    }
}

jQuery("a.callbacktesting").click(function (event) {
    if (success === false) {
        event.preventDefault();
        event.stopImmediatePropagation();

        authentication(event);
    }
});

Если вы пытаетесь вызвать события DOM, вам нужно использовать jQuery.trigger или аналогичный. Мне нужно больше информации о вашей программе, чтобы помочь больше.

0 голосов
/ 12 сентября 2010

Рассмотрите возможность сохранения обратного вызова события click в переменной.Когда пользователь нажимает кнопку, ваш JS сначала проверяет его подлинность.Если это так, он выполняет обратный вызов.Если это не так, он передает обратный вызов подпрограмме аутентификации в качестве аргумента.Когда процедура аутентификации успешна, она может выполнить обратный вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...