Pergunta

Basicamente eu quero ser capaz de envolver qualquer comando em um método $ .holdTillFinished () que não permitirá que a execução continue até que a animação método especificado / jQuery é concluído em execução.

Eu suspeito que isso pode ser difícil ou mesmo impossível em javascript, mas eu estou esperando que alguém vai saber.

Eu não quero ouvir sobre como eu posso passar uma chamada de retorno em uma animação para que seja executado onComplete, ou qualquer outra coisa assim.

Eu realmente quero saber se tal coisa é possível e como fazê-lo.

Se isso não vai acontecer se alguém sabe de uma boa fila de plugin que é capaz de filas ambos os métodos definidos pelo usuário e animações, que seria legal também. O que eu realmente quero é uma forma de execução atraso embora. (Enquanto ainda permitindo animações para função)

Foi útil?

Solução

Eu suspeito que isso pode ser difícil ou mesmo impossível em javascript

Sua suspeita é correta. Métodos como animações, loops de entrada do usuário e 'async = true' XMLHttpRequests deve de controle de retorno para o navegador, a fim de prosseguir, eo navegador não pode obter de volta o controle até que cada nível de aninhamento de chamada de função retornou . Isso significa que todo o seu código, incluindo a função que chamou ‘holdTillFinished ()’ teria para relaxar:., Portanto, ‘holdTillFinished ()’ é impossível

Outros idiomas têm características que permitem que você efetivamente executar um processo assíncrono como um que aparece para o chamador para ser síncrono, e similarmente vice-versa controle de fluxo. O mais conhecido é tópicos e continuações . O JavaScript não possuem essas instalações, de modo que o melhor que você pode fazer é o tempo limite e retornos de chamada.

(Definição de um retorno de chamada como uma função inline para ter acesso a variáveis ??da função encerrando em um fechamento que, pelo menos, tirar um pouco da dor de fora, algumas outras línguas tem que começar a embrulhar cada bit de estado confinado em propriedades de um objeto para conseguir isso.)

Outras dicas

Você está procurando provavelmente http://docs.jquery.com/Effects/queue

Mas se você está procurando uma forma mais generalizada de atrasar as coisas, eu usei esse trecho antes (eu não escrevi isso, então todo o crédito vai para o autor original):

//Simple wrapper enabling setTimout within chained functions.
$.fn.wait = function(time, type) {
  time = time || 1000;
  type = type || "fx";
  return this.queue(type, function() {
    var self = this;
    setTimeout(function() {
      $(self).dequeue();
    }, time);
  });
};

Você pode usar um publish / subscribe arquitetura para conseguir o que deseja. Sem saber muito sobre o que exatamente você quer alcançar, o meu palpite é este trabalho para você.

A forma como isto funciona é que você olha para a conclusão da função como um evento, que você pode ouvir e anexar manipuladores para. Dojo tem um mecanismo pubsub , embora eu tenho certeza que existem outros.

Ele defende em cima situação, mas normalmente é necessário para mostrar uma imagem de processamento a ser mostrada quando AJAX é chamado ou qualquer loop é executado em javascript. Eu tenho uma situação onde eu estou chamando AJAX em um loop, para o usuário para mostrar a imagem de processamento é mostrado. Para encerrar eu fiz um truque. Eu tenho colocar um botão para cancelar o trabalho quando esta função é chamado I definir uma variável digamos 'cancelJob' global como true e no circuito onde eu estou verificando essa mundial se isso é verdade a falsa prazo de retorno eo script vai parar.

var cancelJob = false;
foreach(){
   if(cancelJob == true)
       return false;
}

function cancelButtonPress(){
   cancelJob = true;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top