10.04.2017, 09:34
|
Кандидат Javascript-наук
|
|
Регистрация: 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;
}
|
|
10.04.2017, 10:59
|
Кандидат Javascript-наук
|
|
Регистрация: 23.12.2016
Сообщений: 121
|
|
Неужели нет никаких вариантов?
|
|
10.04.2017, 11:31
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,217
|
|
Сообщение от AlexTrader
|
как сделать выполнение этого запроса асинхронным?
|
При асинхронном ответе все действия выполняются в калбек-функциях.
|
|
10.04.2017, 11:34
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
AlexTrader,
В асинхронном режиме ваша функция executeAjaxRequestReturnData вернет null, т.к. return arr; исполнится, не дожидаясь success
|
|
10.04.2017, 12:14
|
Кандидат Javascript-наук
|
|
Регистрация: 23.12.2016
Сообщений: 121
|
|
Сообщение от Dilettante_Pro
|
AlexTrader,
В асинхронном режиме ваша функция executeAjaxRequestReturnData вернет null, т.к. return arr; исполнится, не дожидаясь success
|
Я в курсе, в топе описал ситуацию, как решить вопрос?
|
|
10.04.2017, 12:15
|
Кандидат Javascript-наук
|
|
Регистрация: 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);
}
});
}
|
|
10.04.2017, 12:16
|
Кандидат Javascript-наук
|
|
Регистрация: 23.12.2016
Сообщений: 121
|
|
Как с callback достать данные и записать в переменную agent?
|
|
10.04.2017, 12:19
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
AlexTrader,
Вам для чего нужен возвращаемый результат?
Если для заполнения каких-то полей, то делать это в разделе success.
Если для чего-либо другого - то в success генерить какое-то событие, и результат смотреть в обработчике (arr можно сделать глобальной)
|
|
10.04.2017, 12:28
|
Кандидат Javascript-наук
|
|
Регистрация: 23.12.2016
Сообщений: 121
|
|
Сообщение от Dilettante_Pro
|
AlexTrader,
Вам для чего нужен возвращаемый результат?
Если для заполнения каких-то полей, то делать это в разделе success.
Если для чего-либо другого - то в success генерить какое-то событие, и результат смотреть в обработчике (arr можно сделать глобальной)
|
Этот запрос получает данные определённого агента, из которого я достаю Fio, т.о. мне просто нужно чтобы первый метод GetAgentFio вернул строку(Fio) и всё, неужели это нельзя реализовать, как то заставить callback сохранить полученные данные из запроса в переменную
|
|
10.04.2017, 13:04
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
AlexTrader,
Сообщение от AlexTrader
|
заставить callback сохранить полученные данные из запроса в переменную
|
Еще раз:
Никакая функция ничего вам не вернет.
arr можно сделать глобальной - чтобы она была видна везде - и присваивать значение в success. Но при этом неизвестно, когда изменилось значение arr.
Для того, чтобы определить, когда можно посмотреть новое значение arr, нужно в success генерить какое-нибудь событие.
Последний раз редактировалось Dilettante_Pro, 10.04.2017 в 13:08.
|
|
|
|