Eu tenho um pequeno problema com a função jquery $ .ajax ().
Eu tenho um formulário onde cada clique no botão de rádio ou seleção no menu suspenso cria uma variável de sessão com o valor selecionado.
Agora - eu tenho um dos menus suspensos que tem 4 opções - o primeiro (com rótulo Nenhum) tem um valor = "" os outros têm seus ids.
O que eu quero que aconteça é a opção Nenhum (com valor em branco) para remover a sessão e outra para criar uma, mas somente se a sessão com este nome de seleção específico ainda não existir - já que todas as outras opções têm a mesma quantidade atribuída a ela - está apenas indicando qual foi selecionado.
Não tenho certeza se isso faz sentido - mas dê uma olhada no código - talvez isso o torne mais claro:
$("#add_ons select").change(function() {
// get current price of the addons
var order_price_addon = $(".order_price_addon").text();
// get price of the clicked radio button from the rel attribute
var add = $(this).children('option').attr('label');
var name = $(this).attr('name');
var val = $(this).val();
if(val == "") {
var price = parseInt(order_price_addon) - parseInt(add);
removeSession(name);
} else {
if(isSession(name) == 0) {
var price = parseInt(order_price_addon) + parseInt(add);
}
setSession(name, val);
}
$(".order_price_addon").html(price);
setSession('order_price_addon', price);
updateTotal();
});
então - em primeiro lugar, quando o menu #add_ons select aciona "mudança", obtemos alguns valores de alguns elementos para cálculos.
obtemos o atributo label da opção de nosso select que armazena o valor a ser adicionado ao total, nome do select para criar sessão com este nome e valor para depois verificar qual foi selecionado.
agora - verificamos se val == "" (o que indicaria que a opção Nenhum foi selecionada) e deduzimos o valor do total e também removemos a sessão com o nome do select.
Depois disso, é onde o problema começa - instrução else.
Do contrário - queremos verificar se a função isSession () com o nome de nosso seletor retorna 0 ou 1 - se retornar 0, então adicionamos ao total o valor armazenado no atributo label, mas se retornar 1 - isso sugere aquela sessão já existe - então nós apenas mudamos o valor desta sessão recriando-a - mas a quantidade não é adicionada a ela.
Agora a função isSession se parece com isto:
function isSession(selector) {
$.ajax({
type: "POST",
url: '/order.html',
data: ({ issession : 1, selector: selector }),
dataType: "html",
success: function(data) {
return data;
},
error: function() {
alert('Error occured');
}
});
}
Agora - o problema é - que não sei se o uso de "return" retornará o resultado da função - já que não parece funcionar - no entanto, se eu colocar os "dados" na seção success: no alerta - parece retornar o valor correto.
Alguém sabe retornar o valor da função e depois compará-lo na próxima instrução?
Obrigado pessoal - tentei da seguinte forma:
function isSession(selector) {
$.ajax({
type: "POST",
url: '/order.html',
data: ({ issession : 1, selector: selector }),
dataType: "html",
success: function(data) {
updateResult(data);
},
error: function() {
alert('Error occured');
}
});
}
então a função updateResult ():
função updateResult (dados) {resultado = dados; }
resultado - é a variável global - que estou tentando ler:
$("#add_ons select").change(function() {
// get current price of the addons
var order_price_addon = $(".order_price_addon").text();
// get price of the clicked radio button from the rel attribute
var add = $(this).children('option').attr('label');
var name = $(this).attr('name');
var val = $(this).val();
if(val == "") {
var price = parseInt(order_price_addon) - parseInt(add);
removeSession(name);
} else {
isSession(name);
if(result == 0) {
var price = parseInt(order_price_addon) + parseInt(add);
}
setSession(name, val);
}
$(".order_price_addon").html(price);
setSession('order_price_addon', price);
updateTotal();
});
mas por algum motivo - não funciona - alguma ideia?
Respostas:
O problema é que você não pode retornar um valor de uma chamada assíncrona, como uma solicitação AJAX, e esperar que funcione.
O motivo é que o código que está aguardando a resposta já foi executado no momento em que a resposta é recebida.
A solução para esse problema é executar o código necessário dentro do
success:
retorno de chamada. Dessa forma, ele está acessando odata
apenas quando estiver disponível.Outra possibilidade (que é efetivamente a mesma coisa) é chamar uma função dentro de seu
success:
retorno de chamada que transmite os dados quando eles estão disponíveis.fonte
async: false
). Em alguns casos, ter uma chamada assíncrona não é um requisito. Mais sobre jquery.ajax () doc api.jquery.com/jQuery.ajax , não issoAs of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated;
Existem muitas maneiras de obter uma resposta jQuery AJAX. Estou compartilhando com vocês duas abordagens comuns:
Primeiro:
Segundo:
você pode torná-lo tão grande quanto quiser ...
fonte
ajaxObj['responseText']
não existe quando você está definindovar ajaxResponse
Eu vi as respostas aqui e, embora úteis, elas não eram exatamente o que eu queria, já que tive que alterar muito meu código.
O que funcionou para mim foi fazer algo assim:
Espero que ajude alguém
anakin
fonte
Embora todas as abordagens relacionadas ao uso de
async: false
não sejam boas por causa de sua depreciação e travou a página até que a solicitação voltou. Portanto, aqui estão 2 maneiras de fazer isso:1º: Retorne a resposta ajax inteira em uma função e então faça uso da
done
função para capturar a resposta quando a solicitação for concluída. (RECOMENDADO, A MELHOR MANEIRA)LIGUE PARA O ACIMA ASSIM:
PARA VÁRIAS CHAMADAS AJAX, USE
$.when
:2º: Armazene a resposta em um cookie e, fora da chamada ajax, obtenha o valor do cookie. (NÃO RECOMENDADO)
NOTA: No exemplo acima, a
jquery cookies
biblioteca é usada. É bastante leve e funciona bem. Aqui está o link https://github.com/js-cookie/js-cookiefonte
Adicione
async: false
à sua lista de atributos. Isso força o thread javascript a esperar até que o valor de retorno seja recuperado antes de prosseguir. Obviamente, você não gostaria de fazer isso em todas as circunstâncias, mas se um valor for necessário antes de continuar, ele o fará.fonte
async: false
. Isso bloqueia tudo na página durante a recuperação. Você sabe o que significa A em AJAX: Assíncrono. A resposta adequada seria que OP precisa usar osuccess()
retorno de chamada corretamente.async: false
por que o jQuery implementaria essa opção? se eu não carregar grandes quantidades de dados na página e apenas manipular um evento de usuário, não há problema em bloquear todo o resto no curto espaço de tempo para aquele usuário específico. nada de errado e nada de ruim nisso. (se usado corretamente, não bloqueará nada porque, naquele momento específico, nenhuma outra ação para aquele usuário em particular ocorrerá)Isso é muito antigo e feio, não faça isso. Você deve usar callbacks: https://stackoverflow.com/a/5316755/591257
Tive o mesmo problema, resolvi dessa forma, usando uma var global. Não tenho certeza se é o melhor, mas certamente funciona. Em caso de erro, você obtém uma string vazia (myVar = ''), para que possa lidar com isso conforme necessário.
fonte
async: false
aqui, porque no modo assíncrono não é garantido quedata
seja salvomyVar
antes demyVar
ser retornado.pode ajudar, criar uma função de chamada ajax comum e anexar uma função que invoca quando for bem-sucedida a chamada ajax, veja o exemplo
fonte
Com ajuda daqui
Espero que isso ajude alguém em algum lugar um pouco.
fonte
async: false,
é pré-histórico e está obsoleto desde o jQuery v1.8. Provavelmente não ajudará ninguémOlá, tente async: false em sua chamada ajax ..
fonte