Especificamente, como ele difere do padrão ( async: true)?
Em que circunstâncias eu gostaria de definir explicitamente asynccomo falsee isso tem algo a ver com impedir que outros eventos na página sejam disparados?
Sim, parece-me que deve ser chamado de algo diferente de "Ajax" (Asynchronous JavaScript and XML) se não é assíncrona ...
devlord
Assíncrono significa que o script enviará uma solicitação ao servidor e continuará sua execução sem aguardar a resposta. Assim que a resposta é recebida, um evento do navegador é acionado, o que, por sua vez, permite que o script execute ações associadas.
SagarPPanchal
Respostas:
300
Isso tem algo a ver com impedir que outros eventos sejam disparados na página?
Sim.
Definir async como false significa que a instrução que você está chamando deve ser concluída antes que a próxima instrução em sua função possa ser chamada. Se você definir async: true, essa instrução começará sua execução e a próxima instrução será chamada, independentemente de a instrução async já ter sido concluída.
Eu sempre me perguntei como isso foi feito, já que o JavaScript não é encadeado.
Matt
4
@ L.DeLeo - não, de maneira alguma - adiados são outra maneira de gerenciar a complexidade de chamadas de funções assíncronas - async: falseremove completamente a assincronicidade da chamada . A chamada para ajaxblocos - o código a seguir não é executado até que o servidor responda.
Sean Vieira
14
Lembre-se de que isso também significa que o navegador não capturará / disparará nenhum evento que esteja acontecendo enquanto o ajax estiver sendo executado. Descobri isso da maneira mais difícil, tentando descobrir por que o Firefox não estava acionando um evento de clique. Acabou sendo devido a um evento de desfoque "forçado" com uma seguinte chamada de sincronização bloqueando-o.
Parece async: falseestá morto, eu tentei e consegui18:17:49.384 Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user’s experience. For more help http://xhr.spec.whatwg.org/ 1 jquery.js:9061:4
Aba
120
async:false= Código pausado . (Outro código aguardando o término.)
async:true= Código continuado . (Nada é pausado. Outro código não está aguardando .)
Se você desativar a recuperação assíncrona, seu script será bloqueado até que a solicitação seja atendida. É útil para executar alguma sequência de solicitações em uma ordem conhecida, embora eu ache os retornos de chamada assíncronos mais limpos.
Joe: isso dependeria de você ter algum thread de trabalho em segundo plano.
John Millikin
10
Um caso de uso é fazer uma ajaxchamada antes que o usuário feche a janela ou saia da página. Seria como excluir alguns registros temporários no banco de dados antes que o usuário possa navegar para outro site ou fechar o navegador.
$(window).unload(function(){
$.ajax({
url:'your url',global:false,
type:'POST',
data:{},async:false,//blocks window close
success:function(){}});});
Nenhuma quantidade de JavaScript vai parar de uma janela do navegador de fechar
jammykam
Eu precisava de assíncrono falso para algo completamente não relacionado, mas ele resolveu o meu problema, pois permitia que o meu script capturasse um valor de um arquivo xml antes de preenchê-lo na página como indefinido.
O XMLHttpRequest síncrono fora dos trabalhadores está sendo removido da plataforma da Web, pois tem efeitos negativos para a experiência do usuário final. (Esse é um processo longo que leva muitos anos.) Os desenvolvedores não devem passar falso para o argumento assíncrono quando o ambiente global JavaScript é um ambiente de documento. Os agentes do usuário são fortemente encorajados a avisar sobre esse uso nas ferramentas do desenvolvedor e podem experimentar lançar uma exceção InvalidAccessError quando ela ocorrer. A direção futura é permitir apenas XMLHttpRequests nos threads de trabalho. A mensagem pretende ser um aviso para esse efeito.
Definir async como false significa que as instruções após a solicitação ajax terão que aguardar a conclusão da solicitação. Abaixo está um caso em que é necessário definir async para false, para que o código funcione corretamente.
var phpData =(function get_php_data(){var php_data;
$.ajax({
url:"http://somesite/v1/api/get_php_data",async:false,//very important: else php_data will be returned even before we get Json from the url
dataType:'json',
success:function(json){
php_data = json;}});return php_data;})();
O exemplo acima explica claramente o uso de async: false
Ao defini-lo como false, garantimos que, depois que os dados forem recuperados do URL , somente depois retornemos php_data; é chamado
Apenas no caso de alguém ter o mesmo problema que eu: Esta resposta destaca que a return php_datadeclaração não pode estar na função de sucesso, mas deve estar fora da $.ajax()função. Eu tinha colocado o meu equivalente do return php_datainterior do success: function(){}e foi sempre retornando indefinido
<!DOCTYPE html><html><head><basehref="https://demos.telerik.com/kendo-ui/numerictextbox/index"><style>html {font-size:14px;font-family: Arial, Helvetica, sans-serif;}</style><title></title><linkrel="stylesheet"href="https://kendo.cdn.telerik.com/2019.3.1023/styles/kendo.default-v2.min.css"/><scriptsrc="https://kendo.cdn.telerik.com/2019.3.1023/js/jquery.min.js"></script><scriptsrc="https://kendo.cdn.telerik.com/2019.3.1023/js/kendo.all.min.js"></script></head><body><divid="example"><divid="add-product"class="demo-section k-content"><pclass="title">Add new product</p><ulid="fieldlist"><li><label>
Price:
<inputid="currency"type="number"title="currency"value="30"min="0"max="100"style="width:100%;"/></label></li><li><label>
Price Discount:
<inputid="percentage"value="0.05"title="percentage"style="width:100%;"/></label></li><li><label>
Weight:
<inputid="custom"value="2"title="custom"style="width:100%;"/></label></li><li><label>
Currently in stock:
<inputid="numeric"type="number"title="numeric"value="17"min="0"max="100"step="1"style="width:100%;"/></label></li></ul></div><script>
$(document).ready(function(){// create NumericTextBox from input HTML element
$("#numeric").kendoNumericTextBox();// create Curerncy NumericTextBox from input HTML element
$("#currency").kendoNumericTextBox({
format:"c",
decimals:3});// create Percentage NumericTextBox from input HTML element
$("#percentage").kendoNumericTextBox({
format:"p0",
min:0,
max:0.1,
step:0.01});// create NumericTextBox from input HTML element using custom format
$("#custom").kendoNumericTextBox({
format:"#.00 kg"});});</script><style>.demo-section {padding:0;}#add-product .title {font-size:16px;color:#fff;background-color:#1e88e5;padding:20px30px;margin:0;}#fieldlist {margin:00-1.5em;padding:30px;}#fieldlist li {list-style: none;padding-bottom:1.5em;}#fieldlist label {display: block;padding-bottom:.6em;font-weight: bold;text-transform: uppercase;font-size:12px;}#fieldlist label .k-numerictextbox {font-size:14px;}</style></div></body></html>
Respostas:
Sim.
Definir async como false significa que a instrução que você está chamando deve ser concluída antes que a próxima instrução em sua função possa ser chamada. Se você definir async: true, essa instrução começará sua execução e a próxima instrução será chamada, independentemente de a instrução async já ter sido concluída.
Para obter mais informações, consulte: jQuery ajax success anonymous function scope
fonte
async: false
remove completamente a assincronicidade da chamada . A chamada paraajax
blocos - o código a seguir não é executado até que o servidor responda.async: false
está morto, eu tentei e consegui18:17:49.384 Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user’s experience. For more help http://xhr.spec.whatwg.org/ 1 jquery.js:9061:4
async:false
= Código pausado . (Outro código aguardando o término.)async:true
= Código continuado . (Nada é pausado. Outro código não está aguardando .)Tão simples como isso.
fonte
Async:False
manterá a execução do código restante. Depois de obter a resposta do ajax, somente então, o restante do código será executado.fonte
Se você desativar a recuperação assíncrona, seu script será bloqueado até que a solicitação seja atendida. É útil para executar alguma sequência de solicitações em uma ordem conhecida, embora eu ache os retornos de chamada assíncronos mais limpos.
fonte
Um caso de uso é fazer uma
ajax
chamada antes que o usuário feche a janela ou saia da página. Seria como excluir alguns registros temporários no banco de dados antes que o usuário possa navegar para outro site ou fechar o navegador.fonte
De
https://xhr.spec.whatwg.org/#synchronous-flag
O XMLHttpRequest síncrono fora dos trabalhadores está sendo removido da plataforma da Web, pois tem efeitos negativos para a experiência do usuário final. (Esse é um processo longo que leva muitos anos.) Os desenvolvedores não devem passar falso para o argumento assíncrono quando o ambiente global JavaScript é um ambiente de documento. Os agentes do usuário são fortemente encorajados a avisar sobre esse uso nas ferramentas do desenvolvedor e podem experimentar lançar uma exceção InvalidAccessError quando ela ocorrer. A direção futura é permitir apenas XMLHttpRequests nos threads de trabalho. A mensagem pretende ser um aviso para esse efeito.
fonte
Definir async como false significa que as instruções após a solicitação ajax terão que aguardar a conclusão da solicitação. Abaixo está um caso em que é necessário definir async para false, para que o código funcione corretamente.
O exemplo acima explica claramente o uso de async: false
Ao defini-lo como false, garantimos que, depois que os dados forem recuperados do URL , somente depois retornemos php_data; é chamado
fonte
return php_data
declaração não pode estar na função de sucesso, mas deve estar fora da$.ajax()
função. Eu tinha colocado o meu equivalente doreturn php_data
interior dosuccess: function(){}
e foi sempre retornando indefinidouse esta opção decimais: 3
aqui está o URL: https://demos.telerik.com/kendo-ui/numerictextbox/index
fonte