Показать сообщение отдельно
  #8 (permalink)  
Старый 19.07.2016, 20:35
Интересующийся
Отправить личное сообщение для EnVires Посмотреть профиль Найти все сообщения от EnVires
 
Регистрация: 05.07.2016
Сообщений: 20

Сообщение от warren buffet Посмотреть сообщение
Нельзя запускать асинхронные методы в синхронных мотоцЫклах. Цикл просто нахерачит столько запросов, сколько начитает и уже его кости сгниют, пока эти все запросы начнут валиться с сервера в хаотическом порядке причем. В таких делах ведущим является ответ сервера, а все остальное уже к нему цепляется. Например

/* _items ==  копия, 
если global_Items можно похерить, то его юзай прямо */
var _items=global_Items, 

next=function(err,datak) {

	/* если найдено, то запоздалые ответы сервера не обосрут малину */
	if(found) return true;

	if(!err && datak) {
		name = gitem['market_name'];
		price = datak['min_price'];
		hash = datak['hash'];
		return found = true; 
	}

	/* вытаскиваем по элемену из копии массива пока он не кончится */
	if(!gitem = _items.shift())
		return found=false;
	
	if (gitem['market_name'].indexOf(iteam) != -1 
		&& gitem['market_name'].indexOf('Сувенир')== -1 ) {

		/* и делаем запрос с колбэком на саму себя */
		getItem(gitem['classid']+'_'+gitem['instanceid'],next);
		
		return; /* следующую итерацию запустит ответ сервера */

	}
	else
		return next(); /* рекурсия */
		
};

/* запуск */
next();


Должно работать. Я сам слабо в таких делах волоку. )))

ЗЫ Но это все равно неправильно. Такой скрипт _должен_ что-то сделать, такое, конечное, окончательное. Он не может просто забить какие-то переменные данными, поскольку там, где они нужны, их ждут синхронно? То есть единственный асинхронный метод тянет за собой всю цепочку асинхрона до смертного одра.

и выдаст ошибку Maximum call stack size exceeded
Ответить с цитированием