Используя $ .post в функции JavaScript, не можете присвоить значение переменной?

StackOverflow https://stackoverflow.com/questions/824431

  •  05-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать $ .post внутри функции, получить результаты, а затем вернуть функцию true или false на основе результатов обратного вызова $ .post. Однако обратный вызов, кажется, происходит, ПОСЛЕ возврата события родительской функции.

Вот текущий код, переменная ret всегда неопределена, но если я оповестю ее () в обратном вызове $ .post, он вернет правильный результат;

function elementExists(key, type, path, appid, pid){
    var ret;
    $.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
        ret = data;                         
    });

    alert(ret);
    return ret;

}
Это было полезно?

Решение

Как вы обнаружили, пост выполняется асинхронно. Если вы хотите, чтобы он был синхронным, вам нужно использовать ajax и установите для параметра async значение false. Однако было бы лучше признать, что сообщение является асинхронным, и построить ваш код таким образом, чтобы действие, выполняемое обратным вызовом, не зависело от метода, который вызывает сообщение. Очевидно, что вы действительно хотите сделать что-то кроме оповещения, но не зная, что трудно посоветовать вам, как это сделать.

РЕДАКТИРОВАТЬ . Я понимаю, что ваш код проверяет, существует ли что-то, но проверяет это с определенной целью. Если бы мы знали, какова цель, то можно было бы порекомендовать, как выполнить это в обратном вызове, чтобы метод мог быть реорганизован.

Другие советы

function elementExists(key, type, path, appid, pid){
        $.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
           alert(data);
        });
  }

функция (data) - это обратный вызов (асинхронный), вы не можете возвращать подобные значения.

если обратный вызов не вызывается до тех пор, пока не завершится вызов страницы, но ваш " return ret " выполняется сразу после вызова $ .post

Если вы хотите установить синхронность, установите async: false

Смотрите документы http://docs.jquery.com/Ajax/jQuery.post#urldatacallbacktype

Проблема в том, что ваш код выполняется асинхронно. То есть alert (ret) на самом деле вызывается перед ret = data, что происходит после завершения Ajax-запроса.

Вы можете сделать ваши ajax-вызовы синхронными (не рекомендуется), используя async или измените код.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top