Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   асинхронный запрос (https://javascript.ru/forum/misc/68331-asinkhronnyjj-zapros.html)

AlexTrader 10.04.2017 09:34

асинхронный запрос
 
Здравствуйте, подскажите пожалуйста есть код, работающий в синхронном режиме, всё было нормально пока этих запросов было мало, сейчас количество запросов выросло и время обработки запросов стало критичным, если просто перевожу ajax в синхронный режим работы (async убираю, либо true), то запрос не присваивает переменной arr ответ от сервера и возвращает null, как сделать выполнение этого запроса асинхронным?
GetAgentFio: function (clientGuid) {
        if (clientGuid === undefined || clientGuid === null)
            return '<Нет данных>';
        var param = {
            resource: "Clients/GetClient",
            method: "GET",
            parameters: { id: clientGuid }
        };
        var agent = Ajax2.executeAjaxRequestReturnData(param);
        return agent !== undefined && agent !== null && agent.length !== 0 ? agent[0].Fio : '<Нет данных>';
    }

executeAjaxRequestReturnData: function (data) {
        var arr = null;
        console.log("Параметры запроса к API " + data.resource + ":");
        console.log(data);
        $.ajax({
            async: false,
            type: "POST",
            url: "/api/proxy",
            dataType: "json",
            contentType: "application/json",
            data: JSON.stringify(data),
            success: function (response) {
                console.log("Ответ от API " + data.resource + ":");
                console.log(response);
                arr = response;
            },
            error: function (status) {
                alert("Ошибка при получении данных при запросе к " + data.resource + ":" + status.responseText);
            }
        });
        return arr;
    }

AlexTrader 10.04.2017 10:59

Неужели нет никаких вариантов?

ksa 10.04.2017 11:31

Цитата:

Сообщение от AlexTrader
как сделать выполнение этого запроса асинхронным?

При асинхронном ответе все действия выполняются в калбек-функциях. ;)

Dilettante_Pro 10.04.2017 11:34

AlexTrader,
В асинхронном режиме ваша функция executeAjaxRequestReturnData вернет null, т.к. return arr; исполнится, не дожидаясь success

AlexTrader 10.04.2017 12:14

Цитата:

Сообщение от Dilettante_Pro (Сообщение 449701)
AlexTrader,
В асинхронном режиме ваша функция executeAjaxRequestReturnData вернет null, т.к. return arr; исполнится, не дожидаясь success

Я в курсе, в топе описал ситуацию, как решить вопрос?

AlexTrader 10.04.2017 12:15

Цитата:

Сообщение от ksa (Сообщение 449700)
При асинхронном ответе все действия выполняются в калбек-функциях. ;)

Это тоже понимаю,

executeAjaxRequest: function (data, callback) {
        console.log("Параметры запроса к API " + data.resource + ":");
        console.log(data);
        $.ajax({
            type: "POST",
            url: "/api/proxy",
            dataType: "json",
            contentType: "application/json",
            data: JSON.stringify(data),
            success: function (response) {
                console.log("Ответ от API " + data.resource + ":");
                console.log(response);
                callback.success(response);
            },
            error: function (status) {
                callback = [];
                alert("Ошибка при получении данных при запросе к " + data.resource + ":" + status.responseText);
            }
        });
    }

AlexTrader 10.04.2017 12:16

Как с callback достать данные и записать в переменную agent?

Dilettante_Pro 10.04.2017 12:19

AlexTrader,
Вам для чего нужен возвращаемый результат?
Если для заполнения каких-то полей, то делать это в разделе success.
Если для чего-либо другого - то в success генерить какое-то событие, и результат смотреть в обработчике (arr можно сделать глобальной)

AlexTrader 10.04.2017 12:28

Цитата:

Сообщение от Dilettante_Pro (Сообщение 449707)
AlexTrader,
Вам для чего нужен возвращаемый результат?
Если для заполнения каких-то полей, то делать это в разделе success.
Если для чего-либо другого - то в success генерить какое-то событие, и результат смотреть в обработчике (arr можно сделать глобальной)

Этот запрос получает данные определённого агента, из которого я достаю Fio, т.о. мне просто нужно чтобы первый метод GetAgentFio вернул строку(Fio) и всё, неужели это нельзя реализовать, как то заставить callback сохранить полученные данные из запроса в переменную

Dilettante_Pro 10.04.2017 13:04

AlexTrader,
Цитата:

Сообщение от AlexTrader
заставить callback сохранить полученные данные из запроса в переменную

Еще раз:
Никакая функция ничего вам не вернет.
arr можно сделать глобальной - чтобы она была видна везде - и присваивать значение в success. Но при этом неизвестно, когда изменилось значение arr.
Для того, чтобы определить, когда можно посмотреть новое значение arr, нужно в success генерить какое-нибудь событие.


Часовой пояс GMT +3, время: 19:18.