JQuery AJAX вывод как возвращение функции - PullRequest
0 голосов
/ 09 января 2010

Я создал небольшой скрипт php, который возвращает результат mysql в зависимости от заданных параметров post / get. С этим файлом я теперь могу использовать команду jquery.post или .get для получения чего-либо из моей базы данных.

Скрипт всегда возвращает 1 значение. Поэтому я попытался создать функцию javascript, которая возвращает извлеченное значение из базы данных.

Это то, что я хочу, но я не работаю так, как должно:

function mysql(args) {
    $.post("scripts/ajax_mysql.php",args,function(data) {
        return data;
    });
}

var value=mysql({ table:"user", where:"nickname='test'", get:"email" });

Кажется, что данные извлекаются, когда функция уже пройдена. Есть ли обходной путь для этого?

Ответы [ 3 ]

2 голосов
/ 09 января 2010

Если оставить в стороне вопрос о том, чтобы позволить пользователю в основном создавать любые SQL-команды и отправлять их на ваш сервер - ужасная идея с ужасными последствиями для безопасности, проблема с вашим сценарием - это неспособность понять природу AJAX. 1001 *

Вызов AJAX является асинхронным, поэтому ваш метод возвращается до завершения вызова AJAX. У вас есть два способа справиться с этим. Передайте обратный вызов вашей функции и выполните обратный вызов, когда завершится публикация AJAX. Это сохраняет асинхронный характер запроса. Кроме того, вы можете использовать полный синтаксис $ .ajax (), чтобы выполнить публикацию и установить для параметра async значение true. Затем вы можете сохранить результаты запроса AJAX в переменной, ограниченной внешним блоком в вашей функции, и вернуть ее в конце функции. Установка async в значение true в основном делает то, что делает обратный вызов, за исключением того, что jQuery обрабатывает его под капотом.

function mysql(data, callback) {
     $.post( "scripts/ajax_mysql.php",args,function(data) {
         if (callback) {
            callback(data);
         }
     });
}

mysql({ table:"user", where:"nickname='test'", get:"email" }, function(user) {
     $('#email').val(user.email);
     ...
});

или

function mysql(data, callback) {
     var value;
     $.ajax({
        url: "scripts/ajax_mysql.php",
        type: 'post',
        async: false,
        data: args,
        success: function(data) {
                    value = data;
                 }
     });
     return value;
}

с существующей семантикой вызова.

1 голос
/ 09 января 2010

Ajax является асинхронным. Вызов функции запускает запрос, а затем программа продолжается.

Когда запрос возвращается и событие запускается, а обработчик события, связанный с данными, обрабатывает данные.

Вы можете использовать XHR для синхронизации, но это не рекомендуется.

Разработайте вашу программу для обработки извлеченных данных в обратном вызове, а не в качестве возвращаемой переменной.

0 голосов
/ 09 января 2010

Проблема в том, что оператор return data не вызывает "возврата" в функции mysql.

Что бы я сделал, чтобы из функции mysql возвратил объект XMLHTTPRequest при вызове $.postвозвращается, а затем добавьте прослушиватель для успешного вызова ajax.

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