Как выполнить код последовательно?

Ссылка скопирована
1 ответ
function SubmitData (data) { 	// Проверка включена ли grecaptcha в настройках 	if ($('#grecaptcha').length > 0) {         $.getScript('https://www.google.com/recaptcha/api.js?render=SITEKEY', function() {             grecaptcha.ready(function() { 		grecaptcha.execute('SITEKEY', {action: '123'}).then(function(token) { 			console.log('111'); 		});             });         }); 	} 	console.log('222');  	$.ajax({         type: "POST",         url: address,         data: $(formId).serialize(),         contentType: "application/x-www-form-urlencoded",         dataType: "text",         success: function (data) {         }     }); }

function SubmitData (data) { // Проверка включена ли grecaptcha в настройках if ($('#grecaptcha').length > 0) { $.getScript('https://www.google.com/recaptcha/api.js?render=SITEKEY', function() { grecaptcha.ready(function() { grecaptcha.execute('SITEKEY', {action: '123'}).then(function(token) { console.log('111'); }); }); }); } console.log('222'); $.ajax({ type: "POST", url: address, data: $(formId).serialize(), contentType: "application/x-www-form-urlencoded", dataType: "text", success: function (data) { } }); }

При выполнении функции я вижу в Console сначала вывод 222, а спустя время 111.

Как исправить? Требуется, если выполняется условие $('#grecaptcha').length > 0, чтобы выполнение $.ajax начиналось только после выполнения grecaptcha.execute

Дополнительно:

async function SubmitData(data) {   let captchaToken;    // Проверка включена ли grecaptcha в настройках   if ($('#grecaptcha').length > 0) {     captchaToken = await getCaptchaToken({action: '123'});   }      console.log(captchaToken);    const response = await postForm(address, formId);    console.log(response); }  function postForm(sendTo, formId) {   return new Promise(res => {     $.ajax({       type: "POST",       url: sendTo,       data: $(formId).serialize(),       contentType: "application/x-www-form-urlencoded",       dataType: "text",       success: (data) => {         return res(data);       }     });   })  }  function getCaptchaToken(opts) {   const SITE_KEY = 'SITEKEY';    return new Promise((res) => {     $.getScript('https://www.google.com/recaptcha/api.js?render=' + SITE_KEY, () => {       grecaptcha         .ready(() => {           grecaptcha             .execute(SITE_KEY, opts)             .then((token) => {               return res(token);             });         });     });   }) }

async function SubmitData(data) { let captchaToken; // Проверка включена ли grecaptcha в настройках if ($('#grecaptcha').length > 0) { captchaToken = await getCaptchaToken({action: '123'}); } console.log(captchaToken); const response = await postForm(address, formId); console.log(response); } function postForm(sendTo, formId) { return new Promise(res => { $.ajax({ type: "POST", url: sendTo, data: $(formId).serialize(), contentType: "application/x-www-form-urlencoded", dataType: "text", success: (data) => { return res(data); } }); }) } function getCaptchaToken(opts) { const SITE_KEY = 'SITEKEY'; return new Promise((res) => { $.getScript('https://www.google.com/recaptcha/api.js?render=' + SITE_KEY, () => { grecaptcha .ready(() => { grecaptcha .execute(SITE_KEY, opts) .then((token) => { return res(token); }); }); }); }) }

1. Перестань jquery использовать
2. await

Ну или продолжай цепочку коллбэков

function SubmitData (data) { 	// Проверка включена ли grecaptcha в настройках 	if ($('#grecaptcha').length > 0) {         $.getScript('https://www.google.com/recaptcha/api.js?render=SITEKEY', function() {             grecaptcha.ready(function() { 		grecaptcha.execute('SITEKEY', {action: '123'}).then(function(token) { 			console.log('111'); 		}).then(()=> { 	$.ajax({         type: "POST",         url: address,         data: $(formId).serialize(),         contentType: "application/x-www-form-urlencoded",         dataType: "text",         success: function (data) {         }     }); });             });         }); 	} 	console.log('222'); }

function SubmitData (data) { // Проверка включена ли grecaptcha в настройках if ($('#grecaptcha').length > 0) { $.getScript('https://www.google.com/recaptcha/api.js?render=SITEKEY', function() { grecaptcha.ready(function() { grecaptcha.execute('SITEKEY', {action: '123'}).then(function(token) { console.log('111'); }).then(()=> { $.ajax({ type: "POST", url: address, data: $(formId).serialize(), contentType: "application/x-www-form-urlencoded", dataType: "text", success: function (data) { } }); }); }); }); } console.log('222'); }

  • Василий Банников проблема в том, что придется 2 раза вставлять $.ajax одинаковый при такой конструкции
  • Us59, зачем 2 раза одинаковый $.ajax? Почему придётся?
    Ааа, понял.
    Ну тогда в функцию выноси.

    Или смотри первую половину моего ответа - выкидывай нафиг этот $.ajax и используй fetch. Ты что, по гайдам из 2003 года учился?

  • Василий Банников, придерживаюсь основных функций текущего проекта, т.к. это доработки проекта, а не написание чего-то с полного 0
  • Us59, а в чём проблема то заюзать fetch и async/await?
    Это же не отдельная библиотека, которая сделает код жирнее, да никакую особенную архитектуру не диктует.
  • Василий Банников, можете показать пример? Смысл в том, что функция SubmitData вызывается во многих частях проекта, и нужно доработать часть с загрузкой рекапчи именно в самой функции, чтобы не перелопачивать весь проект. Тем временем я пойду изучать fetch в гугле, т.к. не использовал ранее.
  • Us59, типа так:
    Даже без перехода на fetch
    async function SubmitData (data) { 	// Проверка включена ли grecaptcha в настройках 	if ($('#grecaptcha').length > 0) {         await $.getScript('https://www.google.com/recaptcha/api.js?render=SITEKEY', function() {             grecaptcha.ready(function() { 		grecaptcha.execute('SITEKEY', {action: '123'}).then(function(token) { 			console.log('111'); 		});             });         }); 	} 	console.log('222');  await $.ajax({         type: "POST",         url: address,         data: $(formId).serialize(),         contentType: "application/x-www-form-urlencoded",         dataType: "text",         success: function (data) {         }     }); }

    async function SubmitData (data) { // Проверка включена ли grecaptcha в настройках if ($('#grecaptcha').length > 0) { await $.getScript('https://www.google.com/recaptcha/api.js?render=SITEKEY', function() { grecaptcha.ready(function() { grecaptcha.execute('SITEKEY', {action: '123'}).then(function(token) { console.log('111'); }); }); }); } console.log('222'); await $.ajax({ type: "POST", url: address, data: $(formId).serialize(), contentType: "application/x-www-form-urlencoded", dataType: "text", success: function (data) { } }); }

  • Василий Банников, попробовал применить этот код, однако результат такой же, в Console видим вызов 222, и только через время 111.
  • Василий Банников, разобрался. Вы можете использовать await только тогда, когда ваш ответ возвращает обещание. К сожалению, jQuery ajax не возвращает Promise после завершения.
  • Us59, какой "этот"?
  • Us59,

    К сожалению, jQuery ajax не возвращает Promise после завершения.

    Тогда коллбэки используй, либо уходи с jquery)

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Елена Вебер Ответ

Для выполнения кода последовательно в PHP, вы можете использовать конструкцию if-else или switch-case для проверки условий и выполнения определенных действий в зависимости от результата.

Пример использования конструкции if-else:

$number = 10;
 
if ($number > 0) {
    echo "Число больше нуля";
} else {
    echo "Число меньше или равно нулю";
}

$number = 10; if ($number > 0) { echo "Число больше нуля"; } else { echo "Число меньше или равно нулю"; }

В данном примере, если переменная $number больше нуля, то будет выведено сообщение "Число больше нуля", в противном случае будет выведено "Число меньше или равно нулю".

Если у вас есть несколько условий, которые нужно проверить последовательно, вы можете использовать конструкцию switch-case:

$day = "Monday";
 
switch ($day) {
    case "Monday":
        echo "Сегодня понедельник";
        break;
    case "Tuesday":
        echo "Сегодня вторник";
        break;
    default:
        echo "Сегодня неизвестный день";
}

$day = "Monday"; switch ($day) { case "Monday": echo "Сегодня понедельник"; break; case "Tuesday": echo "Сегодня вторник"; break; default: echo "Сегодня неизвестный день"; }

В данном примере, в зависимости от значения переменной $day будет выполнен определенный блок кода. Если значение переменной не соответствует ни одному из case, будет выполнен блок кода в секции default.

Таким образом, вы можете последовательно выполнять код в PHP, используя конструкции if-else или switch-case для проверки условий и выполнения соответствующих действий.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно