Нельзя запускать асинхронные методы в синхронных мотоцЫклах. Цикл просто нахерачит столько запросов, сколько начитает и уже его кости сгниют, пока эти все запросы начнут валиться с сервера в хаотическом порядке причем. В таких делах ведущим является ответ сервера, а все остальное уже к нему цепляется. Например
/* _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();
Должно работать. Я сам слабо в таких делах волоку. )))
ЗЫ Но это все равно неправильно. Такой скрипт _должен_ что-то сделать, такое, конечное, окончательное. Он не может просто забить какие-то переменные данными, поскольку там, где они нужны, их ждут синхронно? То есть единственный асинхронный метод тянет за собой всю цепочку асинхрона до смертного одра.
|