Eu tenho o seguinte código JavaScript:
$('a.button').click(function(){
if (condition == 'true'){
function1(someVariable);
function2(someOtherVariable);
}
else {
doThis(someVariable);
}
});
Como posso garantir que a function2
chamada seja feita apenas após a function1
conclusão?
javascript
jquery
Rrryyyaaannn
fonte
fonte
function1
executando uma operação assíncrona?Respostas:
Especifique um retorno de chamada anônimo e faça com que function1 aceite:
fonte
...do stuff
contém coisas que são assíncronas? A função2 ainda não dispara quando esperado. O exemplo no meu comentário acima mostra que, como afoo()
função possui código assíncrono,bar()
ela não dispara seu conteúdo depois quefoo()
o conteúdo é executado, mesmo usando$.when().then()
para chamá-los um após o outro. Esta resposta é válida apenas se (e somente se) todas as coisas...do stuff
em seu código forem estritamente síncronas.callBack()
depois de todos n assíncronas chamadas são feitas. Como o OP não mencionou o que está fazendo na função, assumiu-o como uma chamada assíncrona de nível.Se você estiver usando o jQuery 1.5, poderá usar o novo padrão de adiados:
Editar: Link atualizado do blog:
Rebecca Murphy teve um ótimo artigo sobre isso aqui: http://rmurphey.com/blog/2010/12/25/deferreds-coming-to-jquery/
fonte
$.when(function1).then(function2);
(sem os parênteses que chamam a função)?function1
deve retornar uma promessa. Nesse caso, ele precisa ser a função executada real, não a referência. Quandoresolve
é convocada essa promessa, entãofunction2
é executada. Isso é facilmente explicado assumindo quefunction1
há uma chamada ajax. Odone
retorno de chamada resolveria a promessa. Espero que esteja claro.Tente o seguinte:
fonte
Esta resposta usa
promises
, um recurso JavaScript doECMAScript 6
padrão. Se sua plataforma de destino não suportarpromises
, preencha com o PromiseJs .As promessas são uma maneira nova (e muito melhor) de lidar com operações assíncronas em JavaScript:
Isso pode parecer uma sobrecarga significativa para este exemplo simples, mas para código mais complexo é muito melhor do que usar retornos de chamada. Você pode facilmente encadear várias chamadas assíncronas usando várias
then
instruções:Você também pode agrupar os adiadores do jQuery facilmente (retornados pelas
$.ajax
chamadas):Como observou @charlietfl, o
jqXHR
objeto retornado por$.ajax()
implementa aPromise
interface. Portanto, não é realmente necessário envolvê-lo em umPromise
, ele pode ser usado diretamente:fonte
Promise.resolve
embrulho$.ajax
é anti-padrão desde$.ajax
retornos thennable promessaPromise
, apenas implementa a interface. Não tenho certeza de como ele se comporta ao passar um realPromise
para seuthen
método, ou o que umPromise.all
faria se ajqXHR
e aPromise
fossem passados para ele. Para isso, preciso fazer mais testes. Mas obrigado pela dica, vou adicioná-la à resposta!$.ajax.then
não é novaOu você pode acionar um evento personalizado quando uma função é concluída e vinculá-lo ao documento:
Usando esse método, a função 'b' pode executar APÓS a função 'a', pois o gatilho só existe quando a função a termina de executar.
fonte
você pode fazer assim
fonte
Isso depende do que a função1 está fazendo.
Se a função1 estiver executando algum javascript sincronizado simples, como atualizar um valor div ou algo assim, a função2 será acionada após a conclusão da função1.
Se a função1 estiver fazendo uma chamada assíncrona, como uma chamada AJAX, você precisará criar um método de "retorno de chamada" (a maioria das APIs do ajax possui um parâmetro de função de retorno de chamada). Em seguida, chame function2 no retorno de chamada. por exemplo:
fonte
Se o método 1 precisar ser executado após o método 2, 3, 4. O trecho de código a seguir pode ser a solução para isso usando o objeto Adiado em JavaScript.
fonte
Se function1 é alguma função de sincronização que você deseja transformar em uma assíncrona, porque leva algum tempo para concluir, e você não tem controle sobre ela para adicionar um retorno de chamada:
A saída será:
... e após 2 segundos:
Isso funciona porque chamar window.setTimeout () adicionará uma tarefa ao loop de tarefas JS runtine, que é o que uma chamada assíncrona faz e porque o princípio básico de "execução até a conclusão" do tempo de execução JS garante que onClick () nunca é interrompido antes de terminar.
Observe que isso é tão engraçado quanto pode ser o código difícil de entender ...
fonte