骨干事件处理程序中的回调

时间:2014-06-05 13:57:08

标签: events backbone.js callback marionette

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

我正在请求处理程序。

处理程序正在调用一个函数,而该函数又向服务器发出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);
    });

2 个答案:

答案 0 :(得分:0)

尝试

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

答案 1 :(得分:0)

您只需返回承诺,然后在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);
});

这是有道理的,因为你正在进行异步。将承诺传递给关心的方法使处理更加清晰。