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

Я пытаюсь использовать $ .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;

}

Ответы [ 3 ]

2 голосов
/ 05 мая 2009

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

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

1 голос
/ 05 мая 2009
function elementExists(key, type, path, appid, pid){
        $.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
           alert(data);
        });
  }

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

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

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

см. Документы http://docs.jquery.com/Ajax/jQuery.post#urldatacallbacktype

0 голосов
/ 05 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...