Javascript - объекты локальной области, недоступные из вложенной функции - PullRequest
2 голосов
/ 03 февраля 2011

Я пытаюсь заставить функцию захватить объект из php-файла на другой странице. Я использую функцию jQuery ajax, чтобы сделать захват json, который работает правильно. Проблема в том, когда я пытаюсь вернуть этот объект из функции.

Первый раз, когда я регистрирую объект (из функции успеха), он корректен в консоли, но возвращенный объект из функции getGantt () регистрируется как «неопределенный».

Как мне получить этот объект из функции?

Мой код:

    function getGantt(requestNumber){
        var ganttObject;
        $.ajax({
               type: "POST",
               url: "get_gantt.php",
               data: {request_number: requestNumber},
               success: function(returnValue){
                     ganttObject = $.parseJSON(returnValue);
                    console.log(ganttObject); //this logs a correct object in the console

                }
        });
        return ganttObject;
    }

    $(function(){ //document ready function

        var requestNumber = $('#request_number').text();

        var ganttObject = getGantt(requestNumber);
        console.log(ganttObject); //this logs "undefined"

    }); //end document ready function

Ответы [ 3 ]

7 голосов
/ 03 февраля 2011

A в Ajax является важной частью аббревиатуры. Асинхронный JavaScript и XML асинхронный.

$.ajax({success:someFunction}) означает Создайте HTTP-запрос и, когда ответ придет, запустите someFunction

return ganttObject выполняется до ответа.

Вы должны делать все, что хотите, с данными внутри someFunction и не пытаться возвращать данные в вызывающую функцию.

1 голос
/ 03 февраля 2011

A в AJAX обозначает асинхронный. Таким образом, вызов немедленно возвращается, и как только он завершается, вызывается обратный вызов.

Итак, просто измените свой код, чтобы использовать обратный вызов:

function getGantt(requestNumber, callback) {
    var ganttObject;
    $.ajax({
        type: "POST",
        dataType: 'json',
        url: "get_gantt.php",
        data: {request_number: requestNumber},
        success: function(returnValue){
            callback(returnValue);
        }
    });
}

$(function() {

    var requestNumber = $('#request_number').text();

    var ganttObject = getGantt(requestNumber, function(ganttObject) {
        console.log(ganttObject);
    });

});

Кстати, я также удалил этот материал parseJSON - установка dataType в json делает работу и является менее грязной.

0 голосов
/ 03 февраля 2011

Я знаю, почему это не возвращает по крайней мере. GanttObject может находиться в той же области видимости, но функция успеха в конечном итоге выполняется в обратном вызове readyState из объекта XMLHTTP, поэтому он находится в другом потоке, чем функция getGantt. Можете ли вы сделать $ (function () {... code отдельно от вашей функции успеха?

...