Javascript.RU

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

Остановить цыкл после выполнения функции
top:
	for (var y = 0; y < global_Items.length; y++) {
	    if (global_Items[y]['market_name'].indexOf(iteam) != -1 && global_Items[y]['market_name'].indexOf('Сувенирный')== -1 && global_Items[y]['market_name'].indexOf('Сувенир')== -1) {
			console.log(global_Items[y]['market_name']);
	        var iditeam = global_Items[y]['classid'] + '_' + global_Items[y]['instanceid'];
	        getItem(iditeam, function(err, datak) {
	            if (!err) {					
					found = true;
	                name = global_Items[y]['market_name'];
	                price = datak['min_price'];
	                hash = datak['hash'];
					break top;
			    }
	        });

	    }

	}
}


Нужно после if (!err) { как то остановить цыкл,запущенный выше?Подскажите как это сделать
Ответить с цитированием
  #2 (permalink)  
Старый 06.07.2016, 14:38
Интересующийся
Отправить личное сообщение для EnVires Посмотреть профиль Найти все сообщения от EnVires
 
Регистрация: 05.07.2016
Сообщений: 20

up
Ответить с цитированием
  #3 (permalink)  
Старый 06.07.2016, 16:36
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

а как работает getItem? что-то загружает с сервера?
если callback вызывается асинхронно, то надо убрать цикл, а каждую след. итерацию вызывать в callback, если "есть ошибка" (то есть в случае if (err))
Ответить с цитированием
  #4 (permalink)  
Старый 07.07.2016, 10:12
Интересующийся
Отправить личное сообщение для EnVires Посмотреть профиль Найти все сообщения от EnVires
 
Регистрация: 05.07.2016
Сообщений: 20

да,получает ответ с сервера.Такая функция
request({
		   url: url, 
		   json: true
	    }, function (error, response, body) {
				body = JSON.parse(JSON.stringify(body));
				if(body.error === undefined) return callback(false,body);
			    else return callback(true,body);
	});
Ответить с цитированием
  #5 (permalink)  
Старый 07.07.2016, 10:14
Интересующийся
Отправить личное сообщение для EnVires Посмотреть профиль Найти все сообщения от EnVires
 
Регистрация: 05.07.2016
Сообщений: 20

поподробней можно?
Ответить с цитированием
  #6 (permalink)  
Старый 07.07.2016, 12:17
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

примерно такъ (не проверял):

var findSomeItem = function findSomeItem(y, callback) {

    if (y < global_Items.length) {
        if (global_Items[y]['market_name'].indexOf(iteam) != -1 &&
            global_Items[y]['market_name'].indexOf('Сувенирный')== -1 &&
            global_Items[y]['market_name'].indexOf('Сувенир')== -1) {

            console.log(global_Items[y]['market_name']);
            var iditeam = global_Items[y]['classid'] + '_' + global_Items[y]['instanceid'];
            
            getItem(iditeam, function(err, datak) {
                if (!err) {					
                    found = true;
                    name = global_Items[y]['market_name'];
                    price = datak['min_price'];
                    hash = datak['hash'];
                    callback();
                } else {
                    findSomeItem(y + 1, callback);
                }
            });
        } else {
            findSomeItem(y + 1, callback);
        }
    } else {
        callback();
    }
};

findSomeItem(0, function() {
    // здесь выполняем дальнейший код, поиск завершен
    // ..
});

Последний раз редактировалось Яростный Меч, 08.07.2016 в 00:18.
Ответить с цитированием
  #7 (permalink)  
Старый 08.07.2016, 13:34
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

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

/* _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();


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

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

Последний раз редактировалось warren buffet, 08.07.2016 в 13:45.
Ответить с цитированием
  #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
Ответить с цитированием
  #9 (permalink)  
Старый 20.07.2016, 07:15
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

На js нет лимита рекурсии, это не пехепе, ограничения определяет сам браузер, какие у кого тут http://stackoverflow.com/questions/7...ack-size-limit

Но самый тупняк в том, что ты состаришься и твои внуки уже состарятся, пока стек переполнится в этой рекурсивной функции, которая запускает сама себя _после_ ответа сервера. Сервер-то отвечает за секунды, а не за микросекунды.
Ответить с цитированием
  #10 (permalink)  
Старый 20.07.2016, 07:59
Интересующийся
Отправить личное сообщение для EnVires Посмотреть профиль Найти все сообщения от EnVires
 
Регистрация: 05.07.2016
Сообщений: 20

Сообщение от warren buffet Посмотреть сообщение
На js нет лимита рекурсии, это не пехепе, ограничения определяет сам браузер, какие у кого тут http://stackoverflow.com/questions/7...ack-size-limit

Но самый тупняк в том, что ты состаришься и твои внуки уже состарятся, пока стек переполнится в этой рекурсивной функции, которая запускает сама себя _после_ ответа сервера. Сервер-то отвечает за секунды, а не за микросекунды.
что же,на node.js этот код
var findSomeItem = function findSomeItem(y, callback) {

    if (y < global_Items.length) {
        if (global_Items[y]['market_name'].indexOf(iteam) != -1 &&
            global_Items[y]['market_name'].indexOf('Сувенирный')== -1 &&
            global_Items[y]['market_name'].indexOf('Сувенир')== -1) {

            console.log(global_Items[y]['market_name']);
            var iditeam = global_Items[y]['classid'] + '_' + global_Items[y]['instanceid'];
            
            getItem(iditeam, function(err, datak) {
                if (!err) {					
                    found = true;
                    name = global_Items[y]['market_name'];
                    price = datak['min_price'];
                    hash = datak['hash'];
                    callback();
                } else {
                    findSomeItem(y + 1, callback);
                }
            });
        } else {
            findSomeItem(y + 1, callback);
        }
    } else {
        callback();
    }
};

findSomeItem(0, function() {
    // здесь выполняем дальнейший код, поиск завершен
    // ..
});

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
остановить действие функции Alexancho Общие вопросы Javascript 6 02.04.2013 08:40
Остановка выполнения функции .each() TylerDurden Общие вопросы Javascript 6 06.03.2013 02:31
Остановить выполнение функции tsigel jQuery 3 19.12.2012 15:09
Остановить функцию внутри другой функции sliv Общие вопросы Javascript 5 07.10.2012 18:07
Условие выполнения функции TAILER Events/DOM/Window 2 28.02.2010 23:26