Events 主干事件处理程序中的回调
如何获取结果的值(粗体) 我请求一个处理者 Handler正在调用一个函数,而这个函数又向服务器发出ajax调用 我希望能够完成ajax调用并相应地返回结果 在下面的代码中,无论发生什么错误或成功,“result”总是false,因为App.reqres是在ajax调用完成之前返回的 如何重新构造代码 鉴于Events 主干事件处理程序中的回调,events,backbone.js,callback,marionette,Events,Backbone.js,Callback,Marionette,如何获取结果的值(粗体) 我请求一个处理者 Handler正在调用一个函数,而这个函数又向服务器发出ajax调用 我希望能够完成ajax调用并相应地返回结果 在下面的代码中,无论发生什么错误或成功,“result”总是false,因为App.reqres是在ajax调用完成之前返回的 如何重新构造代码 鉴于 resetPassword: function(event) { var ***result*** = App.reqres.request('reset_passw
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);
});
一个解决方案:(有没有更好的方法??)
试一试
return $.when(promise).then(function(data, textStatus, jqXHR) {
return true;
}).fail(function() {
return false;
});
您只需返回承诺,然后在
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);
});
这是有意义的,因为您正在创建异步。将承诺传递回关心它的方法会使处理变得更加清晰。这样的结果是“未定义的”。因为所有调用都是在ajax调用完成之前返回的。谢谢你关于木偶的书,顺便说一句:)哦,你说得对。。。似乎您需要按照您的建议使用回调,或者返回一个承诺并在调用它的地方处理返回值。请参阅(忽略
setTimeout
),很高兴您喜欢这些书!
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);
});