优雅地通过多个回调传递“点击事件”

时间:2010-09-11 19:13:49

标签: javascript asynchronous callback

当非登录用户点击给定按钮时,我想停止该事件,收集他的oauth,如果我没有它,则收集他的电子邮件,然后执行该事件。

我想在javascript中做所有事情,因为这会让事情变得更加简单。

这就是我执行它的方式,我有两个问题:

  1. 是否有更优雅的方式进行多级回调?
  2. 我在最后触发事件的方式似乎很苛刻。有什么可能是更好的方法呢?
  3.   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 个答案:

答案 0 :(得分:1)

这是什么:

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或类似的东西。我需要有关您的计划的更多信息,以便提供更多帮助。

答案 1 :(得分:0)

考虑将click事件回调存储在变量中。当用户单击该按钮时,您的JS首先检查它是否经过身份验证。如果是,则执行回调。如果不是,则将回调作为参数传递给身份验证例程。验证例程成功后,它就可以执行回调。