【问题标题】:Callback in backbone event handler主干事件处理程序中的回调
【发布时间】:2014-06-05 13:57:08
【问题描述】:

如何获取结果的值(粗体)。

我正在请求处理程序。

处理程序正在调用一个函数,该函数又对服务器进行 ajax 调用。

我希望能够完成 ajax 调用并相应地返回结果。

在下面的代码中,任何错误或成功的“结果”总是错误的,因为在 ajax 调用完成之前返回 App.reqres。

如何重组我的代码?

在视图中

    resetPassword: function(event) {
        var ***result*** = App.reqres.request('reset_password', this.$email.val());
        if(!result){
            // If email is not registered
        }else{
           // send a link to reset password
        }
    },

处理程序

   var API = {
        reset_password: function(email, callback) {
            var promise = // some ajax call to the server

            var result = false;

            $.when(promise).then(function(data, textStatus, jqXHR) {
                result = true;
            }).fail(function() {
                result = false;
            }).done(function(){
                return result;
            });
        }
    };

    App.reqres.setHandler("reset_password", function(email) {
        return API.reset_password(email);
    });

一个解决方案:(有没有更好的方法??)

    resetPassword: function(event) {

        var message = this.$message;
        **// the whole block is passed as callback**
        var callback = function(result) {
            if (!result) {
                message.html('Email is not registered.')
                message.removeClass('success');
                message.addClass('error');
            } else {
                message.html('A reset code and reset password link has been sent to this email.')
                message.removeClass('error');
                message.addClass('success');
            }
        }
        var result = App.reqres.request('reset_password', this.$email.val(), callback);

    }

    var API = {
        reset_password: function(email, callback) {
            var promise = promiseObject('resetPassword', {'email': email}, 'POST');

            $.when(promise).then(function(data, textStatus, jqXHR) {
               callback(true); **// pass the result in the callback function**
            }).fail(function() {
                callback(false); **// pass the result in the callback function**
            });
        }

    };

    App.reqres.setHandler("reset_password", function(email, callback) {
        return API.reset_password(email, callback);
    });

【问题讨论】:

    标签: events backbone.js callback marionette


    【解决方案1】:

    您可以简单地返回承诺,然后在您的 resetPassword 方法中使用您的回调,如下所示:

    resetPassword: function(event) {
        var message = this.$message;
        App.reqres.request('reset_password', this.$email.val())
          .then(function() {
            // send link to reset password
            message.html('A reset code and reset password link has been sent to this email.')
            message.removeClass('error');
            message.addClass('success');
          })
          .fail(function() {
            // If email is not registered
            message.html('Email is not registered.')
            message.removeClass('success');
            message.addClass('error');
          });
    },
    

    然后您的请求处理程序将如下所示:

    var API = {
        reset_password: function(email) {
            var promise = // some ajax call to the server
    
            return $.when(promise);
        }
    };
    
    App.reqres.setHandler("reset_password", function(email) {
        return API.reset_password(email);
    });
    

    这是有道理的,因为您正在制作异步。将 Promise 传递回关心的方法可以更清晰地处理它。

    【讨论】:

      【解决方案2】:

      试试

              return $.when(promise).then(function(data, textStatus, jqXHR) {
                  return true;
              }).fail(function() {
                  return false;
              });
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多