Jquery $ .post - От сервера к клиенту - как он узнает, какой ответ получить? - PullRequest
0 голосов
/ 20 августа 2010

Итак, у нас есть это:

$.post('testeUpdate.php', 'someValue'
        function(dadosResposta) {
            $('#ns-nome').val(dadosResposta.nsName);
            $('#ns-endereco').val(dadosResposta.nsAddress);
        },
"json");

От клиента к серверу: Отправляет «sameValue» в testeUpdate.php, используя POST.

В случае успеха он получает данные, возвращаемые сценарием на стороне сервера, и делает что-то с этим на стороне клиента. Правильно?

Между сценарием на стороне сервера и этим сценарием на стороне клиента есть что-то, чего я не получаю.

Вопрос: Как dadosResposta заполняется данными, возвращаемыми из серверного скрипта? Откуда оно знает? Как это работает? Возможно, также может быть задан вопрос: как jquery узнает, когда что-то происходит «на успехе»?

Или примеряет другой путь: Серверная сторона выполняет скрипт, возвращает некоторые закодированные данные в формате json. Пока здесь хорошо. После этого что происходит? Как мы снова прыгнем в клиентскую часть?

[обновление] Попробую еще раз: Я знаю, что: dadosResposta содержит все, что возвращает серверный скрипт мой вопрос: КАК знает ли он об этом? Как он это делает? [/ Обновление]

Большое спасибо, MEM

Ответы [ 4 ]

5 голосов
/ 20 августа 2010

Функция jQuery .post использует объект XMLHttpRequest для доступа к URL-адресу, который вы ему передали. Сервер отвечает либо 200 OK (успех), либо каким-либо другим ответом (предположительно, сбой).

В случае успеха объект XMLHttpRequest имеет свойство responseText (или responseXML), установленное для данных, возвращаемых сервером. Закулисная функция jQuery, которая обрабатывает ответ, затем просматривает ваш аргумент dataType, чтобы определить, что делать с возвращенными данными. В вашем примере он пытается разобрать его в объект.

Предполагая, что ответ является допустимой строкой JSON, он затем передает этот вновь созданный объект в функцию обратного вызова в качестве первого (и единственного) аргумента, который вы назвали dadosResposta.

Это - это то, как jQuery передает ваши данные в dadosResposta.

Edit: Вот некоторый код, который, вероятно, сродни тому, что происходит:

$.post = function([arguments])
{
    var xhr = new XMLHttpRequest(); // not cross browser compatible, but good enough for demonstration
    xhr.onreadystatechange = function()
    {
        if (xhr.readyState === 4 && xhr.status === 200)
        {
            switch (your_dataType)  // check your data type
            {
                case 'json':
                    your_callback(json_decode(xhr.responseText));    // call your function with JSON object
                    break;
                case 'xml':
                    your_callback(xhr.responseXML);    // call your function with XML
                case ... (etc)
            }
        }
    }

    xhr.open('POST', your_URL, true);
    xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xhr.send();
}
1 голос
/ 20 августа 2010

Параметр в функции обратного вызова (в данном случае dadosResposta) содержит все, что возвращает серверный скрипт. Например, если серверный скрипт только что возвращал слово «завершено» в виде простого текста, dadosResposta будет строкой "completed".

В данном конкретном случае данные представляют собой JSON, что позволяет лучше организовать данные, чтобы к ним можно было обращаться к определенным полям, как в dadosResposta.nsName.

1 голос
/ 20 августа 2010

jQuery знает, что вызов был успешным, когда запрос возвращает код состояния http 200. Если серверу не удается обработать запрос, должен быть возвращен код ошибки (например, 500).

1 голос
/ 20 августа 2010

$.post принимает функцию обратного вызова. Этот обратный вызов принимает один аргумент, который представляет собой данные, возвращаемые с сервера. Итак, в вашем случае dadosResposta - это данные, возвращаемые с сервера.

Он знает, был ли он успешным или нет из-за возвращенного кода состояния в заголовке HTTP (200 OK в этом случае). Вы можете включить в свой обратный вызов второй аргумент, который будет содержать статус.

РЕДАКТИРОВАТЬ: Он знает, потому что именно так работает jQuery. jQuery получает ответ и передает его в качестве параметра вашему обратному вызову. Если вы хотите узнать больше о внутренностях, прочтите XMLHttpRequest .

...