Обратный вызов в обработчике событий магистрали

89
9

Как получить значение результата (полужирный).

Я прошу обработчик.

Обработчик вызывает функцию, которая в свою очередь делает вызов ajax серверу.

Я хочу быть в состоянии закончить с помощью ajax-вызова и соответственно вернуть результат.

В нижеприведенном коде любая ошибка или результат результата всегда ложна, потому что возвращается App.reqres до завершения вызова ajax.

Как я могу реструктурировать свой код?

Ввиду

    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);
});

спросил(а) 2021-01-25T18:34:43+03:00 5 месяцев назад
1
Решение
88

Вы можете просто вернуть обещание, а затем использовать свои обратные вызовы в методе 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);
});

Это имеет смысл, так как вы делаете асинхронный. Передача обещания назад к методу, который волнует, делает его более понятным.

ответил(а) 2021-01-25T18:34:43+03:00 5 месяцев назад
45

Попробуйте


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

ответил(а) 2021-01-25T18:34:43+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема