Проблема с областью действия переменной при возврате значения из $.post

#javascript #jquery #ajax #scope

#javascript #jquery ( jquery ) #аякс #область применения

Вопрос:

У меня есть одна из тех надоедливых проблем с переменной областью видимости с $.post. Перед отправкой формы я хочу сначала проверить, отредактировал ли пользователь содержимое. Я возвращаю false, если пользователь этого не сделал.

Я рассмотрел множество разных примеров в Stackoverflow, и общий способ сделать это — создать функцию и функцию обратного вызова внутри этой функции для обработки обратного вызова. Моя проблема в том, что, когда я вызываю getReturned ниже, обратный вызов не выполняется (знайте это, потому что форма отправляется, и я пробовал оповещение). Кстати, alert("No changes were made so text was not submitted."); успешно вызывается.

Что я делаю не так?

 function getReturn(callback, id, old_variable){
    var return_value = "ERROR";
    $.post('myURL', {"id" : id},
       function(data) {
          var text_from_server = $.trim(data[0].note_text);
          if (old_variable == text_from_server){
             alert("No changes were made so text was not submitted.");
             return_value = false;
             callback(return_value);
          } else {
            return_value = true;
            callback(return_value);
          }
        },
        "json"
     );
    };
var id = 123;
var old_variable = "foo";
getReturn(
       function(return_value){return return_value;/*alert("SUCCESS!");*/}, 
       id, 
       old_variable
);
 

Комментарии:

1. Когда вы тестировали оповещение в обратном вызове, было ли у вас оповещение перед оператором return? @Ariel кажется правильным, но обратный вызов все равно должен быть вызван.

Ответ №1:

Поскольку вы выполняете асинхронный запрос, чтобы проверить, изменилось ли значение, вы должны всегда возвращать false из вашего обработчика отправки. При обратном вызове, если форма была отредактирована, затем вы должны вручную отправить форму с помощью form.submit() . Что-то вроде этого:

 getReturn(   
    function(return_value) {
        if (return_value) {
            $("#myForm").submit();
        }
    },    
    id,    
    old_variable);
return false;
 

Ответ №2:

Вы не понимаете асинхронного выполнения. Вы не можете ничего вернуть из $post! Не забывай об этом. Все, что вы можете сделать, это запустить выполнение чего-либо — вы можете попытаться установить флаг переменной, но это вам не поможет. Вам также необходимо запустить выполнение функции, которая что-то делает с этим флагом, и вы должны вызвать эту функцию изнутри $post .

Функция, которую вы отправляете в качестве обратного вызова, возвращает значение. Но это никуда не возвращает значение. Вы вызываете его внутри $post, и он возвращает значение внутри $post, что вообще не дает вам ничего полезного, поскольку вы ничего не делаете с возвращаемым значением.

Я бы рассказал вам, как его изменить, за исключением того, что вы не сказали, что вы хотите сделать с этим возвращаемым значением.

Комментарии:

1. Спасибо @Ariel. Если old_variable == text_from_server значение true, я хочу вернуть false, чтобы форма не отправлялась.

2. Но вы уже отправили форму на тот момент — иначе как у вас есть text_from_server ?