quiero aplicar validaciones en el correo electrónico si el correo electrónico es válido o no, y después de eso verifique en db usando ajax para verificar que el correo electrónico ya existe y el correo electrónico que ya existe, la verificación debería funcionar si se pasa la primera verificación, esto es lo que hice, estoy atascado en email_ya_exist verifique cómo validar solo si se pasa la verificación anterior, si alguien tiene idea de cómo hacerlo
// code which checking email is valid email: ko.observable((ref = REGISTRY.unsavedUser) != null ? ref.email : void 0).extend({ required: true, email: { params: true, message: 'Please enter a valid email.' }, focus:true }), // function to check email exists var email_exist_check = function() { var errorElement = $('#parent-email-signup'); var emzil = errorElement.val(); return = $.ajax({ url: '/api/v3/email_exists', method: 'POST', async: false, data: { email: emzil }, success: function(data){ console.log(data); }, error: function (response, status) { showFlashMessage('An error occured, please try again later.', 'error'); } }); };la función de correo electrónico existente está lista, estoy atascado en cómo usarlo en el código anterior, por favor ayuda
Nunca, nunca, nunca use async: false en llamadas Ajax.
Que necesitas:
Un envoltorio API, para mayor comodidad y legibilidad del código más adelante.
const API = { email_exists: function (email) { return $.post('/api/v3/email_exists', { email: email }).then(function (result) { // evaluate result & return true (email exists) or false (email is free) return ...; }).fail(function (jqXhr, status, error) { showFlashMessage('An error occured, please try again later.', 'error'); console.log('Error in email_exists', email, jqXhr, status, error); }); }, // add other API functions in the same way };y regla de validación asíncrona que llama a su API:
ko.validation.rules.emailFromAPI = { async: true, validator: function (val, params, callback) { API.email_exists(val).done(function (exists) { callback(!exists); // validation is successful when the email does not exist }); }, message: 'Please enter a valid email.' };un observable que usa esta regla:
email: ko.observable((ref = REGISTRY.unsavedUser) != null ? ref.email : void 0).extend({ required: true, emailFromAPI: true, focus:true }),Dado que ajax es asíncrono, tendrá que esperar la respuesta del servidor, devolver la llamada ajax no esperará a que se resuelva la llamada del servidor. Una forma de resolver esto es usar una devolución de llamada (otra sería promesas con async/await)
var email_exist_check = function(email, onSuccess, onError) { $.ajax({ url: '/api/v3/email_exists', method: 'POST', async: false, data: { email }, success: function(data){ console.log(data); if (data && !data.error) { return onSuccess(); } return onError(data && data.error); }, error: function (response, status) { onError(response); } }); }; // After doing a front-end email verification email_exist_check(ref.email, () => { console.log('Email is valid'); }, (error) => { console.error('Something went wrong', error); });