У меня есть класс JavaScript, который имеет метод:

function someClass() {
    this.someMethod = someClass_someMethod;
}

function someClass_someMethod() {
    // make an AJAX request
}

Проблема в том, что someClass_someMethod() необходимо вернуть значение запроса AJAX.

Я использую метод jQuery $.getJSON() для получения данных. Данные должны быть возвращены, но кажется, что единственный способ получить данные - это обратный вызов.

Как это может быть сделано?

1
Nathan Osman 30 Май 2010 в 07:15

3 ответа

Лучший ответ

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

Обратный вызов на самом деле является единственным способом, так как вам нужно ждать любое произвольное количество времени, чтобы запрос был успешным или ошибочным.

1
alex 30 Май 2010 в 03:19

В этом коде someClass_someMethod собирается сделать не асинхронный запрос и вернуть значение. Таким образом, ничего не будет выполнено, пока запрос не закончится, что позволит вам вернуть значение.

function someClass() {
    this.someMethod = someClass_someMethod;
}

function someClass_someMethod() {
    var ret = {};
    $.ajax({
        url: url,
        dataType: 'json',
        success: function(data) {
            ret = data;
        },
        async: false
    });
    return ret;
}
1
BrunoLM 24 Сен 2010 в 02:43

Вместо того, чтобы беспокоиться обо всех кросс-браузерных проблемах, которые могут возникнуть при написании вашего AJAX с нуля, я бы порекомендовал использовать стандартную инфраструктуру, такую как jQuery, для обработки ваших запросов, как вы делаете в настоящее время. Как отметил Делан Азабани, он асинхронный, и это распространенный запрос среди новичков в асинхронной связи.

function someClass_someMethod(callback) {
    $.getJSON(..., function(data) {
        // process the data here...
        callback(data);
    );
}

Теперь вы можете сделать это:

var someClass = new someClass();
someClass.someMethod(function(data) { 
   ... handle your preprocessed data here ...
});

В этом ответе нет новых понятий, только примеры кода.

1
tbranyen 30 Май 2010 в 04:25