Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.09.2017, 12:31
Новичок на форуме
Отправить личное сообщение для Xenon_x Посмотреть профиль Найти все сообщения от Xenon_x
 
Регистрация: 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");// Не работает из за исинхронности запросов
})();
Ответить с цитированием
  #2 (permalink)  
Старый 13.09.2017, 12:38
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Я думаю дело вовсе не в асинхронности запросов, а в том, что вы пытаетесь создать кросс-доменный запрос.
https://learn.javascript.ru/xhr-crossdomain
Ответить с цитированием
  #3 (permalink)  
Старый 13.09.2017, 14:00
Новичок на форуме
Отправить личное сообщение для Xenon_x Посмотреть профиль Найти все сообщения от Xenon_x
 
Регистрация: 13.09.2017
Сообщений: 5

Цитата:
Я думаю дело вовсе не в асинхронности запросов, а в том, что вы пытаетесь создать кросс-доменный запрос.
Сомневаюсь, так как ответы приходят. Апи публичный и проблем с этим не должно быть, попробуйте сами.
Ответить с цитированием
  #4 (permalink)  
Старый 13.09.2017, 14:04
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Xenon_x,
Сообщение от Xenon_x
ответы приходят
Ответы от функций у вас приходят, не дожидаясь ответа от сервера.

Попробуйте вставить return profile;
в xhr.onload = function(){

убрав из строк 19 и 35

Глупость написал - это же описание обработчика, который ничего не возвращает.
В нем можно записать результат в глобальную переменную и вызвать какое - нибудь событие, в обработчике которого смотреть результат в этой глобальной переменной.

Последний раз редактировалось Dilettante_Pro, 13.09.2017 в 14:12.
Ответить с цитированием
  #5 (permalink)  
Старый 13.09.2017, 14:17
Новичок на форуме
Отправить личное сообщение для Xenon_x Посмотреть профиль Найти все сообщения от Xenon_x
 
Регистрация: 13.09.2017
Сообщений: 5

Сообщение от Nexus Посмотреть сообщение
Я думаю дело вовсе не в асинхронности запросов, а в том, что вы пытаетесь создать кросс-доменный запрос.
https://learn.javascript.ru/xhr-crossdomain
Сообщение от Dilettante_Pro Посмотреть сообщение
Xenon_x,


Ответы от функций у вас приходят, не дожидаясь ответа от сервера.

Попробуйте вставить return profile;
в xhr.onload = function(){

убрав из строк 19 и 35

Глупость написал - это же описание обработчика, который ничего не возвращает.
В нем можно записать результат в глобальную переменную и вызвать какое - нибудь событие, в обработчике которого смотреть результат в этой глобальной переменной.
Интересно, а можно наводку на пример.
Ответить с цитированием
  #6 (permalink)  
Старый 13.09.2017, 14:18
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Сообщение от Xenon_x Посмотреть сообщение
Сомневаюсь, так как ответы приходят. Апи публичный и проблем с этим не должно быть, попробуйте сами.
Прямо на этой странице и пробовал.
Открыл консоль, ввел $.get(/*Ваш url*/); и нажал enter.
В результате в консоли появилось 2 уведомления об ошибке.

Upd. И да, у вас в коде ошибка.
Вы пытаетесь вернуть результат еще до окончания запроса.

Последний раз редактировалось Nexus, 13.09.2017 в 14:22.
Ответить с цитированием
  #7 (permalink)  
Старый 13.09.2017, 14:25
Новичок на форуме
Отправить личное сообщение для Xenon_x Посмотреть профиль Найти все сообщения от Xenon_x
 
Регистрация: 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го метода).
Ответить с цитированием
  #8 (permalink)  
Старый 13.09.2017, 14:34
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Сообщение от 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');
});
Ответить с цитированием
  #9 (permalink)  
Старый 13.09.2017, 14:59
Новичок на форуме
Отправить личное сообщение для Xenon_x Посмотреть профиль Найти все сообщения от Xenon_x
 
Регистрация: 13.09.2017
Сообщений: 5

Интересное решение, разбираюсь. Спасибо!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Асинхронные запросы с ожиданием koha345 jQuery 0 06.08.2017 19:45
Вложенные Ajax запросы Sherminator AJAX и COMET 10 03.10.2016 05:11
Generators и асинхронные запросы в БД node.js madgals Node.JS 2 14.05.2015 09:31
IE/chrome асинхронные запросы zebra AJAX и COMET 1 23.10.2011 04:19
Асинхронные запросы zebra Общие вопросы Javascript 2 11.10.2011 14:48