[JavaScript] Método somente é invocado com alert()

12 respostas
P

Pessoal estou com o seguinte problema!

tenho um método em um laço de repetição e preciso que ele seja invocado mais em cada passagem do indice.
O problema é que ele para na primeira posição do indice. Apenas se eu coloco o alert() ele força a chamada! Estou tentando entender isso!

alguem poderia me AJUDAR por favor? desde já OBRIGADO.

for(var i = 1; i < 3; i++){
											//alert('invocando metodo');					 
											params.catEntryId	= entitledItemJSON[i].catentry_id; //object JSON...
											params.quantity	= quantity;
											wc.service.invoke(ajaxShopCartService, params); //chamada do metodo para executar a cada laço
								  
								}

12 Respostas

Rafael_Guerreiro

Esse erro não faz muito sentido… Aparentemente está tudo certo…

Tente colocar um console.log(); para colocar os valores dos objetos no console e ver se ele está passando certo…

P

creio que seja algo relacionado a timeOut e apenas quando dou um alert() o método é invocado.
Tentei solucionar usando um setInterval() ou setTimeout(), porem com o setInterval() já da o efeito de ficar invocando o método infinitamente, mesmo usando o clearInterval() após invocar a segunda vez!

var params = [];
for(var i = 1; i < 4; i++) {
//alert('inserindo item no carrinho');
params.catEntryId	= entitledItemJSON[i].catentry_id; //object JSON...
params.quantity		= quantity;
timer(params,i);
}


//***************************************************

var myvar;

function timer(params,i) 
{
	alert('qtditens = '+i)

	myvar = setInterval(function(){wc.service.invoke("AddOrderItem", params)},2000);
	
	if(i=='3'){
		alert('clearInterval('+myvar+')');
		clearInterval(myvar);
	}
}
Rafael_Guerreiro

Você verificou se não está dando nenhum erro?

Pode me explicar o que que você quer fazer?

P

Boa tarde Rafael,

realmente verifiquei nos logs do console do firebug e eles não apresentam nenhum erro para mim.

O que eu preciso é executar a chamada de um script dentro de um FOR, porem ele só executava na primeira posição a não ser que eu chamasse um alert dentro do FOR,
Imaginei que pudesse ser algo relacionado a timeOut, por isso só chamava a função uma única vez.
Sendo assim o que eu tentei fazer foi usar o setInterval() para que ele forçe a chamada do metodo em um range de milisegundos.
Funcionou porem ele fica chamando inúmeras vezes mesmo o FOR sendo limitado a 3 posições.

var params = [];
for(var i = 1; i < 3; i++) {
params.catEntryId	= entitledItemJSON[i].catentry_id; //object JSON...
params.quantity		= quantity;
timer(params,i);
}								}

function timer(params,i) 
{
	myvar = setInterval(function(){wc.service.invoke("AddOrderItem", params)},2000);
	
	if(i==2){
		clearInterval(myvar);
	}
}
Rafael_Guerreiro

O setTimeout não vai impedir o seu for de ser executado, ou seja, quando ele fizer o timeOut, ele não vai parar o seu for… Assim, o seu for faz 3 voltas mas o timeOut é executado uma única vez.

Por que que você precisa desse timeOut?

P

estou usando pq da forma como implementei abaixo ele só chama a função apenas umas vez, mesmo passando 3 vezes pelo FOR,

var params = []; for(var i = 1; i < 3; i++) { params.catEntryId = entitledItemJSON[i].catentry_id; //object JSON... params.quantity = quantity; wc.service.invoke("AddOrderItem", params); }

[b]ou seja:

i = 1 (executa a função wc.service.invoke(“AddOrderItem”, params))
i = 2 (não executa a função)

porem se eu coloco um alert(); ele chama invoca/chama a função[/b]

Rafael_Guerreiro

Isso é um ajax?
wc.service.invoke(“AddOrderItem”, params);

P

me parece que sim cara, porem não tenho acesso a ele!
esse esta sendo meu problema =/
preciso tentar resolver isso de alguma forma

Rafael_Guerreiro

Mas é uma péssima prática você fazer um timeout, pois se a conexão for mais lenta que o timeout, o timeout vai passar e o problema vai continuar.

Verifique se essa chamada não tem um callback. Faça assim no console do chrome:

P

parece que não temos nada cara, dê só uma olhada!

Rafael_Guerreiro

Eu não consegui ver esse log… Como que você fez isso?

P

Fala cara, pô valeu man,
consegui resolver passando uma function diretamente em uma váriavel e dando um setInterval() logo abaixo dela:
Deixo aqui a solução para caso alguem passe pelo mesmo problema!
Obrigado.

var params = [];
var varCounter = 1;
var varName = function(){

if(varCounter <= 2) { 
   params.catEntryId= entitledItemJSON[varCounter].catentry_id; //object JSON...
   params.quantity    = quantity;
   wc.service.invoke("AddOrderItem", params);
   varCounter++;
} else {
   clearInterval(myTimer);
}
}
   var myTimer = setInterval(varName, 500); //500 milissegundos
Criado 24 de maio de 2013
Ultima resposta 29 de mai. de 2013
Respostas 12
Participantes 2