Pergunta

por favor me ajude a entender isso.

Você tem uma função que chama alguns métodos:

function() {
   methodA(function(){...});
   methodB();
   methodC();
}

Das linguagens que não possuem callbacks ou funções anônimas me acostumei com o fato de que a execução não continua até que um método retorne.

Então se eu chamasse o métodoA com o callback, a execução teria que esperar até que o método retornasse o que não seria assíncrono, certo?

Para que, por exemplo, eu possa armazenar o retorno de chamada para algum objeto e fazer com que o método A retorne.Então o métodoB e o métodoC são executados.E quando o usuário clica em um botão, algum manipulador executa o retorno de chamada?

Cheguei à conclusão de que não há nada assíncrono em javascript em comparação com java ou python (não em relação a multithreading)....porque em java o retorno de chamada não seria o método de fechamento/anônimo, mas sim um objeto com o método "executar" e seria exatamente o mesmo, só um pouco mais complicado ...Claro que existe este sistema de eventos JS específico para DOM

Foi útil?

Solução

Os retornos de chamada em JavaScript não adicionam implicitamente comportamento assíncrono.Quando uma função de retorno de chamada é invocada, ela é executada certo então, apenas como uma função normal.(Na verdade, uma função de retorno de chamada é apenas uma função normal...)

Por causa disso, é impossível para determinar quando a execução do retorno de chamada no exemplo será executada em relação aos outros métodos (exceto que não pode ser executada antes methodA é invocado) - poderia ser chamado de methodA ou methodB ou com um clique mais tarde, ou não.(No entanto, a menos que haja uma exceção - ou uma das funções invoque uma das outras funções - então methodA será executado antes methodB que por sua vez será executado antes methodC;se methodA lançou uma exceção, então nem methodB nem methodC seria invocado).

O que faz adicionar comportamento assíncrono é um fonte de evento assíncrono, como um evento de timer ou uma ação de UI, como um clique de botão.

No entanto, é importante ter em mente que Javascript não possui nem suporta threading.O Javascript deve "parar" (a execução deve retornar da função de retorno de chamada invocada de uma fonte de evento assíncrono) antes que um novo evento assíncrono possa ser acionado.(Os eventos assíncronos são enfileirados [conforme apropriado] para que um evento de timer não seja "perdido" se outro retorno de chamada demorar muito para ser executado.)

Isso é por que while (true) {} fará com que a página do navegador congele e evite que os manipuladores de eventos de botão sejam processados.

Boa codificação.


Casos de exemplo (demonstração jsfiddle):

function invokeNow(callback) {
   // nothing asynchronous going on here.
   // the callback is invoked right now and the result is returned.
   return callback()
}
alert(invokeNow(function () { return "Hello world!" }))

function doLater(callback) {
    // setup an asynchronous event
    setTimeout(callback, 1000)
    return "It isn't 'later' yet!"
}

alert(doLater(function () {
    alert("Later!")
    // note that this is running in the callback from the previous
    // timer event. if this code was below the outer alert then
    // it wouldn't have allowed the first timer callback to have occurred
    // until the blocking while was complete
    alert(doLater(function () { alert("I still ran!") }))
    var end = (+new Date) + 4000
    while ((+new Date) < end) { /* wait */ }
    alert("I am done waiting")
}))

Aviso:Parece haver um problema com o Firefox 4 (4.0.1) e o código acima.Embora funcione conforme demonstrado, a ordem esperada difere da ordem real se o tempo limite for inferior a cerca de 800 ms.eu postei ENTÃO:Evento de timer assíncrono sendo executado de forma síncrona (“buggy”) no Firefox 4? então espero que haja alguma resolução.O comportamento funciona conforme esperado no Firefox 3, IE 9 e Chrome 11.

Outras dicas

function main() {
   methodA(function callback(){...});
   methodB();
   methodC();
}

Supondo que o retorno de chamada não seja executado imediatamente.

Ordem de execução:

  • métodoA
  • métodoB
  • métodoC
  • ...outras coisas até que a pilha esteja vazia
  • ligar de volta

Javascript é sequencial, exceto se você usar setInterval, setTimeout, ou faça uma solicitação a um servidor com um retorno de chamada ou usando onload.Não tenho certeza se existem outros casos.

Se você tiver algo como:

function methodA(fn){
  ...
  fn();
}

Então o retorno de chamada será chamado quando você ligar methodA(function(){...})

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top