Confira este código :
<a href="#" id="link">Link</a>
<span>Moving</span>
$('#link').click(function () {
console.log("Enter");
$('#link').animate({ width: 200 }, 2000, function() {
console.log("finished");
});
console.log("Exit");
});
Como você pode ver no console, a função "animar" é assíncrona e "bifurca" o fluxo do código de bloco do manipulador de eventos. De fato :
$('#link').click(function () {
console.log("Enter");
asyncFunct();
console.log("Exit");
});
function asyncFunct() {
console.log("finished");
}
siga o fluxo do código de bloco!
Se eu quiser criar o meu function asyncFunct() { }
com esse comportamento, como posso fazê-lo com javascript / jquery? Eu acho que há uma estratégia sem o uso de setTimeout()
javascript
jquery
function
asynchronous
markzzz
fonte
fonte
Respostas:
Você não pode criar uma função assíncrona verdadeiramente personalizada. Eventualmente, você terá que aproveitar uma tecnologia fornecida nativamente, como:
setInterval
setTimeout
requestAnimationFrame
XMLHttpRequest
WebSocket
Worker
onload
De fato, para a animação que o jQuery usa
setInterval
.fonte
setInterval
) , mas que não podemos nem abri-la para ver como é feita. Você tem mais informações sobre o assunto?setImmediate
promises
. Dá umawaitable
?Você pode usar um timer:
(onde
yourFn
é uma referência à sua função)ou, com Lodash :
fonte
setTimeout
é de 4 milissegundos por especificação do HTML5. Dar 0 ainda levará esse tempo mínimo. Mas sim, funciona bem como um adiamento de funções.aqui você tem uma solução simples (outros escrevem sobre isso) http://www.benlesh.com/2012/05/calling-javascript-function.html
E aqui você tem a solução pronta acima:
TESTE 1 ( pode gerar '1 x 2 3' ou '1 2 x 3' ou '1 2 3 x' ):
TESTE 2 ( sempre gera 'x 1' ):
Esta função é executada com o tempo limite 0 - simulará tarefas assíncronas
fonte
console.log(1)
é chamado e a saída (undefined
) é passada como o segundo argumento paraasync()
. No caso do TESTE 1, acho que você não entende completamente a fila de execução do JavaScript. Como cada uma das chamadasconsole.log()
ocorre na mesma pilha,x
é garantido que será registrado por último. Eu votaria negativamente nesta resposta por desinformação, mas não tenho representante suficiente.async(function() {console.log('x')}, function(){console.log(1)});
.TEST 2 as: async(function() {console.log('x')}, function(){console.log(1)});
- já o corrigiAqui está uma função que assume outra função e gera uma versão que executa assíncrona.
É usado como uma maneira simples de criar uma função assíncrona:
Isso é diferente da resposta do @ fider porque a função em si tem sua própria estrutura (nenhum retorno de chamada foi adicionado, já está na função) e também porque cria uma nova função que pode ser usada.
fonte
(function(a){ asyncFunction(a); })(a)
setTimeout(asyncFunction, 0, a);
Edit: Eu entendi totalmente a pergunta. No navegador, eu usaria
setTimeout
. Se fosse importante que fosse executado em outro segmento, eu usaria Web Workers .fonte
Tarde, mas para mostrar uma solução fácil
promises
após a introdução no ES6 , ele lida com chamadas assíncronas muito mais fácil:Você define o código assíncrono em uma nova promessa:
Nota para definir
resolve()
quando a chamada assíncrona termina.Em seguida, adicione o código que deseja executar após a conclusão da chamada assíncrona dentro
.then()
da promessa:Aqui está um trecho:
ou JSFiddle
fonte
Esta página mostra os conceitos básicos da criação de uma função javascript assíncrona.
Desde o ES2017, as funções assíncronas de javacript são muito mais fáceis de escrever. Você também deve ler mais sobre promessas .
fonte
Se você deseja usar Parâmetros e regular o número máximo de funções assíncronas, pode usar um trabalhador assíncrono simples que eu construí:
Você pode usá-lo assim:
fonte
Embora não seja fundamentalmente diferente das outras soluções, acho que minha solução faz mais algumas coisas legais:
Function.prototype
permitir uma maneira melhor de chamá-loAlém disso, a semelhança com a função
Function.prototype.apply
interna parece apropriada para mim.fonte
Ao lado da ótima resposta de @pimvdb, e no caso de você estar se perguntando, o async.js também não oferece funções verdadeiramente assíncronas. Aqui está uma versão (muito) simplificada do método principal da biblioteca:
Portanto, a função protege contra erros e a entrega normalmente ao retorno de chamada, mas o código é tão síncrono quanto qualquer outra função JS.
fonte
Infelizmente, o JavaScript não fornece uma funcionalidade assíncrona. Funciona apenas em um único segmento. Mas a maioria dos navegadores modernos fornece
Worker
s , que são segundos scripts que são executados em segundo plano e podem retornar um resultado. Então, cheguei a uma solução que acho útil executar de forma assíncrona uma função, que cria um trabalhador para cada chamada assíncrona.O código abaixo contém a função
async
para chamar em segundo plano.Este é um exemplo de uso:
Isso executa uma função que itera um
for
número enorme para levar tempo como demonstração de assincronicidade e, em seguida, obtém o dobro do número passado. Oasync
método fornece umfunction
que chama a função desejada em segundo plano e o que é fornecido como parâmetro deasync
retornos de chamadareturn
em seu parâmetro exclusivo. Então, na função de retorno de chamada,alert
o resultado.fonte
O MDN tem um bom exemplo do uso de setTimeout preservando "this".
Como o seguinte:
fonte