如何获得结果的值(粗体)。
我正在请求处理程序。
处理程序正在调用一个函数,而该函数又向服务器发出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);
});
答案 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);
});
这是有道理的,因为你正在进行异步。将承诺传递给关心的方法使处理更加清晰。