13.09.2017, 12:31
|
Новичок на форуме
|
|
Регистрация: 13.09.2017
Сообщений: 5
|
|
Асинхронные запросы
Здравствуйте. Можно ли как то синхронизировать вызовы асинхронных запросов в следующем коде и заставить его работать? Запросы естественно должны остаться асинхронными.
(function() {
'use strict';
var api = {
getUID: function(name){
if(!name) {console.log("Необходимо передать имя пользователя");return;}
console.log("Ищем ID пользователя "+name);
//реализация метода
var ID,
xhr = new XMLHttpRequest();
xhr.open("GET", 'https://api.worldoftanks.ru/wot/account/list/?application_id=demo&limit=1&search='+name, true);
xhr.onload = function(){
var resp = JSON.parse(xhr.response);
if(resp.status !== 'ok') {console.log("Ошибка метода getUID, код ответа: "+resp.status);return;}
ID = resp.data[0].account_id;
console.log(ID);
};
xhr.send();
return ID;
},//Возвращает ID пользователя по его никнейму
getUserByID: function(UID){
if(!UID) {console.log("Необходимо передать ID пользователя");return;}
console.log("Ищем статистику пользователя с ID = "+UID);
//реализация метода
var profile,
xhr = new XMLHttpRequest();
xhr.open("GET", 'https://api.worldoftanks.ru/wot/account/info/?application_id=demo&account_id='+UID, true);
xhr.onload = function(){
var resp = JSON.parse(xhr.response);
if(resp.status !== 'ok') {console.log("Ошибка метода getUID, код ответа: "+resp.status);return;}
profile = resp.data[UID];
};
xhr.send();
return profile;
},//Возвращает статистику пользователя по его ID
getUser: function(name){
if(!name) {console.log("Необходимо передать имя пользователя");return;}
console.log("Ищем ID пользователя "+name);
//реализация метода
var profile = this.getUserByID(this.getUID(name));
return profile;
}//Возвращает статистику пользователя по его никнейму
};
// Your code here...
//api.getUID("Xenon_x");
console.log(api.getUserByID("6258348"));//Не возвращает значение из за асинхронности запроса
api.getUser("Grafiiin");// Не работает из за исинхронности запросов
})();
|
|
13.09.2017, 12:38
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
Я думаю дело вовсе не в асинхронности запросов, а в том, что вы пытаетесь создать кросс-доменный запрос.
https://learn.javascript.ru/xhr-crossdomain
|
|
13.09.2017, 14:00
|
Новичок на форуме
|
|
Регистрация: 13.09.2017
Сообщений: 5
|
|
Цитата:
|
Я думаю дело вовсе не в асинхронности запросов, а в том, что вы пытаетесь создать кросс-доменный запрос.
|
Сомневаюсь, так как ответы приходят. Апи публичный и проблем с этим не должно быть, попробуйте сами.
|
|
13.09.2017, 14:04
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
Xenon_x,
Сообщение от Xenon_x
|
ответы приходят
|
Ответы от функций у вас приходят, не дожидаясь ответа от сервера.
Попробуйте вставить return profile;
в xhr.onload = function(){
убрав из строк 19 и 35
Глупость написал - это же описание обработчика, который ничего не возвращает.
В нем можно записать результат в глобальную переменную и вызвать какое - нибудь событие, в обработчике которого смотреть результат в этой глобальной переменной.
Последний раз редактировалось Dilettante_Pro, 13.09.2017 в 14:12.
|
|
13.09.2017, 14:17
|
Новичок на форуме
|
|
Регистрация: 13.09.2017
Сообщений: 5
|
|
Сообщение от Dilettante_Pro
|
Xenon_x,
Ответы от функций у вас приходят, не дожидаясь ответа от сервера.
Попробуйте вставить return profile;
в xhr.onload = function(){
убрав из строк 19 и 35
Глупость написал - это же описание обработчика, который ничего не возвращает.
В нем можно записать результат в глобальную переменную и вызвать какое - нибудь событие, в обработчике которого смотреть результат в этой глобальной переменной.
|
Интересно, а можно наводку на пример.
|
|
13.09.2017, 14:18
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
Сообщение от Xenon_x
|
Сомневаюсь, так как ответы приходят. Апи публичный и проблем с этим не должно быть, попробуйте сами.
|
Прямо на этой странице и пробовал.
Открыл консоль, ввел $.get(/*Ваш url*/); и нажал enter.
В результате в консоли появилось 2 уведомления об ошибке.
Upd. И да, у вас в коде ошибка.
Вы пытаетесь вернуть результат еще до окончания запроса.
Последний раз редактировалось Nexus, 13.09.2017 в 14:22.
|
|
13.09.2017, 14:25
|
Новичок на форуме
|
|
Регистрация: 13.09.2017
Сообщений: 5
|
|
Сообщение от Nexus
|
Прямо на этой странице и пробовал.
Открыл консоль, ввел $.get(/*Ваш url*/); и нажал enter.
В результате в консоли появилось 2 уведомления об ошибке.
Upd. И да, у вас в коде ошибка.
Вы пытаетесь вернуть результат еще до окончания запроса.
|
Вы конечно частично правы, но попробуйте в консоли вставить следующий код:
var xhr = new XMLHttpRequest();
xhr.open("GET", 'https://api.worldoftanks.ru/wot/account/list/?application_id=demo&limit=1&search=Grafiiin', true);
xhr.onload = function(){console.log(xhr.response);}
xhr.send();
UPD: в этом и суть вопроса, как вернуть ответ и передать его дальше второму методу (смотрите вызов 3го метода).
|
|
13.09.2017, 14:34
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
Сообщение от Xenon_x
|
Вы конечно частично правы, но попробуйте в консоли вставить следующий код:
|
Согласен, работает, я был неправ.
Вот пример:
function getUID(name){
if(!name)
throw new Error("Необходимо передать имя пользователя");
console.log("Ищем ID пользователя "+name);
//реализация метода
return new Promise(function(resolve,reject){
var xhr = new XMLHttpRequest();
xhr.open("GET", 'https://api.worldoftanks.ru/wot/account/list/?application_id=demo&limit=1&search='+name,true);
xhr.onload=function(){
var resp=JSON.parse(xhr.response),
ID=resp.data[0].account_id;
console.log(ID);
resolve(ID);
};
xhr.onerror=function(){
reject(xhr.response);
};
xhr.send();
});
}
getUID('Grafiiin').then(function(UID){
alert(UID);
},function(xhr){
alert('Error');
});
|
|
13.09.2017, 14:59
|
Новичок на форуме
|
|
Регистрация: 13.09.2017
Сообщений: 5
|
|
Интересное решение, разбираюсь. Спасибо!
|
|
|
|