Выполните один запрос AJAX после завершения другого запроса AJAX

Один JS-файл выполняет вызов ajax. В рамках успеха этого ajax-вызова выполняется еще один вызов AJAX. Второй вызов проверяет, зарегистрировано ли электронное письмо. Если это было тогда, второй вызов AJAX не получил возвращенных данных, как показано в firebug и консоли Chrome в этом случае. Но тот же код отлично работает в локальном хосте, а упомянутая проблема происходит ТОЛЬКО в онлайн-сервере.

Хостинговая страница находится по адресу http://twmobilefitness.com/signup/ . Проблема возникает, когда вы нажимаете ссылку «Зарегистрироваться сейчас» в конце. Вы должны зарегистрироваться дважды с тем же адресом электронной почты, если хотите, чтобы проблема возникла.

JS:

 $.ajax( { url : base_url+"/wp-admin/admin-ajax.php", type : 'GET', cache : false, data : 'action=check_user_name&' + Math.floor( ( Math.random() * 100 ) +1 ) + '&user_name='+user_name, success : function( result ) { if ( parseInt( result ) == 0 ) { $( ".result" ).html( '<span class="error">User name not available </span>' ); } else if ( parseInt( result ) == 1 ) { $.ajax( { url : base_url + "/wp-admin/admin-ajax.php", type : 'GET', cache : false, data : 'action=check_email_used&' + Math.floor( ( Math.random() *100 ) +1 ) + '&email=' + email, success : function( result_email ) { if ( parseInt( result_email ) == 0 ) { $( ".result" ).html( '<span class="error">Email already used </span>' ); } else if ( parseInt( result_email ) == 1 ) { $( ".result" ).html( '' ); $( ".signup_div" ).hide(); $( ".signup_emergency_contact" ).show(); } } } ); } } } ); 

functions.php имеет

 add_action('wp_ajax_check_user_name','check_user_name'); add_action('wp_ajax_nopriv_check_user_name','check_user_name'); add_action( 'wp_ajax_check_email_used','check_email_used' ); add_action( 'wp_ajax_nopriv_check_email_used','check_email_used' ); function check_user_name() { global $wpdb; $user_name = trim( $_GET['user_name'] ); $MobTraining = new MobTraining(); $table =trim( "{$wpdb->prefix}users" ); $array_where['user_login'] = $user_name; $sql_fetch = $MobTraining->fetch( $table, $array_where ); $row = $wpdb->get_results( $sql_fetch, ARRAY_A ); if ( sizeof( $row ) != 0 ) { echo '0'; } else { echo '1'; } die(); } function check_email_used() { global $wpdb; $email = trim( $_GET['email'] ); $MobTraining = new MobTraining(); $table = trim( "{$wpdb->prefix}users" ); $array_where['user_email'] = $email; $sql_fetch = "SELECT * FROM $table WHERE `user_email`='$email'"; $row = $wpdb->get_results( $sql_fetch, ARRAY_A ); if ( sizeof( $row ) != 0 ) { echo '0'; } else { echo '1'; } die(); } 

Как заставить код работать в онлайн-сервере?

То, что вы испытываете (AJAX работает локально, но не на сервере) является проблемой задержки. Локально все работает так быстро, что вы не можете увидеть свою проблему. Короче говоря, ваша проблема заключается в следующем:

AJAX callback (A) выполняет> AJAX Callback (B) не знает, что он должен ждать (A)> Вы не можете увидеть проблему в вашей локальной установке, так как (A) завершена слишком быстро.

Поэтому вам нужно найти способ, как сообщить свой Callback (B), что он должен ждать (A). Вот как:

Зарегистрировать скрипты и перенести данные с PHP на JS

Зарегистрируйте и запишите и локализуйте свои данные правильным способом: оберните его в функцию или метод и подключите к wp_enqueue_scripts (public / themes), login_enqueue_scripts (password / login / register) или admin_enqueue_scripts . Использование wp_localize_script() для перемещения данных с PHP на JS и сделать его доступным там.

 add_action( 'admin_enqueue_scripts', 'wpse118772jsObject' ); function wpse118772jsObject() { $scriptHandle = 'custom-script-name'; // Should be divided into separate functions or methods wp_register_script( $scriptHandle, plugins_url( __FILE__, 'your/path' ), array( 'jquery' ), plugin_dir_path( __FILE__ ).'your/path' ), true ); wp_enqueue_script( $scriptHandle ); wp_localize_script( $scriptHandle, 'pluginObject', array( 'ajaxURl' => admin_url( 'admin_ajax.php' ), 'custom' => array( // custom data in here ), ), ); } 

Как правильно использовать jQuery AJAX.

Существует несколько функций, которые вы можете использовать: по умолчанию $.ajax({}); функции или их ярлыки $.post(); , $.getJSON(); , и т.д.

Таким образом, вы можете просто использовать что-то вроде следующего: использование методов объекта « success/fail .

 ( function( $, plugin ) { "use strict"; $.ajax( { url : plugin.ajaxURl, data : { // other data }, // We assume you're responding with a proper wp_send_json_success/error() in the PHP Cb. dataType : "json", // Request transformation possible in here. beforeSend : function( xhr ) { // Example: // xhr.overrideMimeType( 'application/json' ); }, // The actual handlers success : function( data, textStatus, jqXHR ) { // Handle data transformation or DOM manipulation in here. }, error : function( jqXHR, textStatus, errorThrown ) { // silent: Log the error console.info( errorThrown ); // loud: Throw Exception throw errorThrown; } } ); } )( jQuery, pluginObject || {} ); 

Если вы хотите углубиться и сделать все правильно , вам нужно будет использовать цепочку методов. (Остается возможность улучшить положение).

 ( function( $, plugin ) { "use strict"; $.ajax( { url : plugin.ajaxURl, data : { // other data }, } ) .done( function( data ) { // Handles successful responses only } ) .fail( function( reason ) { // Handles errors only console.debug( reason ); } ) .always( function( data, textStatus, response ) { // If you want to manually separate stuff // response becomes errorThrown/reason OR jqXHR in case of success } ) .then( function( data, textStatus, response ) { // In case your working with a deferred.promise, use this method // Again, you'll have to manually separates success/error } ); } )( jQuery, pluginObject || {} ); 

Примечание. Для получения более подробных примеров обертки вокруг обратного вызова, взгляните на commonjs или AMD и их разницу.

Ожидание других ответов AJAX

Интересная и самая мощная часть всей обработки jQuery (и других libararies) AJAX – вопрос заключается в том, как дождаться завершения A, чтобы затем запустить B и его обработку. Ответ – «отложенная» загрузка и «обещания».

Я добавлю быстрый пример. Возможно, вам стоит подумать о том, как строить и создавать объекты и отделять их, добавляя их через this. к объекту, но для примера должно быть достаточно:

Пример (A) Это в основном, как я это делаю. Вам нужно будет заполнить бит самостоятельно.

 ( function( $, plugin ) { "use strict"; $.when( $.ajax( { url : pluginURl, data : { /* ... */ } } ) .done( function( data ) { // 2nd call finished } ) .fail( function( reason ) { console.info( reason ); } ); ) // Again, you could leverage .done() as well. See jQuery docs. .then( // Success function( response ) { // Has been successful // In case of more then one request, both have to be successful }, // Fail function( resons ) { // Has thrown an error // in case of multiple errors, it throws the first one }, ); } )( jQuery, pluginObject || {} ); 

Пример (B) Я никогда не пробовал это, но он тоже должен работать. Легче читать, но мне нравится $.when() решил обещать больше.

 ( function( $, plugin ) { "use strict"; $.ajax( { url : plugin.ajaxURl, data : { // other data } } ) .done( function( data ) { // Handles successful responses only } ) .fail( function( reason ) { console.info( reason ); } ) // Promise finished: .then( function( data ) { $.ajax( { url : pluginURl, data : { /* ... */ } } ) .done( function( data ) { // 2nd call finished } ) .fail( function( reason ) { console.info( reason ); } ); } ); } )( jQuery, pluginObject || {} ); 

Если вы хотите получить более подробную информацию, прочитайте Документы об deferred и then .