Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.04.2017, 09:34
Кандидат Javascript-наук
Отправить личное сообщение для AlexTrader Посмотреть профиль Найти все сообщения от AlexTrader
 
Регистрация: 23.12.2016
Сообщений: 121

асинхронный запрос
Здравствуйте, подскажите пожалуйста есть код, работающий в синхронном режиме, всё было нормально пока этих запросов было мало, сейчас количество запросов выросло и время обработки запросов стало критичным, если просто перевожу 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;
    }
Ответить с цитированием
  #2 (permalink)  
Старый 10.04.2017, 10:59
Кандидат Javascript-наук
Отправить личное сообщение для AlexTrader Посмотреть профиль Найти все сообщения от AlexTrader
 
Регистрация: 23.12.2016
Сообщений: 121

Неужели нет никаких вариантов?
Ответить с цитированием
  #3 (permalink)  
Старый 10.04.2017, 11:31
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от AlexTrader
как сделать выполнение этого запроса асинхронным?
При асинхронном ответе все действия выполняются в калбек-функциях.
Ответить с цитированием
  #4 (permalink)  
Старый 10.04.2017, 11:34
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

AlexTrader,
В асинхронном режиме ваша функция executeAjaxRequestReturnData вернет null, т.к. return arr; исполнится, не дожидаясь success
Ответить с цитированием
  #5 (permalink)  
Старый 10.04.2017, 12:14
Кандидат Javascript-наук
Отправить личное сообщение для AlexTrader Посмотреть профиль Найти все сообщения от AlexTrader
 
Регистрация: 23.12.2016
Сообщений: 121

Сообщение от Dilettante_Pro Посмотреть сообщение
AlexTrader,
В асинхронном режиме ваша функция executeAjaxRequestReturnData вернет null, т.к. return arr; исполнится, не дожидаясь success
Я в курсе, в топе описал ситуацию, как решить вопрос?
Ответить с цитированием
  #6 (permalink)  
Старый 10.04.2017, 12:15
Кандидат Javascript-наук
Отправить личное сообщение для AlexTrader Посмотреть профиль Найти все сообщения от AlexTrader
 
Регистрация: 23.12.2016
Сообщений: 121

Сообщение от ksa Посмотреть сообщение
При асинхронном ответе все действия выполняются в калбек-функциях.
Это тоже понимаю,

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);
            }
        });
    }
Ответить с цитированием
  #7 (permalink)  
Старый 10.04.2017, 12:16
Кандидат Javascript-наук
Отправить личное сообщение для AlexTrader Посмотреть профиль Найти все сообщения от AlexTrader
 
Регистрация: 23.12.2016
Сообщений: 121

Как с callback достать данные и записать в переменную agent?
Ответить с цитированием
  #8 (permalink)  
Старый 10.04.2017, 12:19
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

AlexTrader,
Вам для чего нужен возвращаемый результат?
Если для заполнения каких-то полей, то делать это в разделе success.
Если для чего-либо другого - то в success генерить какое-то событие, и результат смотреть в обработчике (arr можно сделать глобальной)
Ответить с цитированием
  #9 (permalink)  
Старый 10.04.2017, 12:28
Кандидат Javascript-наук
Отправить личное сообщение для AlexTrader Посмотреть профиль Найти все сообщения от AlexTrader
 
Регистрация: 23.12.2016
Сообщений: 121

Сообщение от Dilettante_Pro Посмотреть сообщение
AlexTrader,
Вам для чего нужен возвращаемый результат?
Если для заполнения каких-то полей, то делать это в разделе success.
Если для чего-либо другого - то в success генерить какое-то событие, и результат смотреть в обработчике (arr можно сделать глобальной)
Этот запрос получает данные определённого агента, из которого я достаю Fio, т.о. мне просто нужно чтобы первый метод GetAgentFio вернул строку(Fio) и всё, неужели это нельзя реализовать, как то заставить callback сохранить полученные данные из запроса в переменную
Ответить с цитированием
  #10 (permalink)  
Старый 10.04.2017, 13:04
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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

Последний раз редактировалось Dilettante_Pro, 10.04.2017 в 13:08.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать асинхронный запрос wadim Общие вопросы Javascript 1 12.03.2017 18:47
Не отправляется 2й запрос после 1го. (XMLHttpRequest) Артист AJAX и COMET 6 05.10.2016 00:37
Асинхронный ajax запрос imonzx AJAX и COMET 3 13.06.2015 00:02
Асинхронный ajax запрос ставится в очередь ring AJAX и COMET 2 08.02.2011 17:47
Yahoo UI асинхронный POST запрос lisan AJAX и COMET 1 12.02.2010 13:57