Prefácio
Na minha imagem, assíncrono apareceu pela primeira vez com Ajax. Eu ainda estava trabalhando no .NET naquela época, e então .Net realmente lançou um controle assíncrono ...
Embora eu finalmente soubesse que não era assíncrono ... então, o front-end assíncrono é muito usado. Se não for um programa assíncrono, você tem vergonha de dizer que os nodejs que você escreveu foram feitos pelo Opportunity JavaScript.
A característica do modelo de programação assíncrona também foi trazida. Assíncrono tem muitas vantagens, mas é um pesadelo para o design. O assíncrono pode atrapalhar o tempo, por isso aumenta as dificuldades de design.
No entanto, o assíncrono revolucionou a melhoria do desempenho e a experiência do usuário, portanto, os recursos assíncronos dos NodeJs são bastante óbvios. Hoje vamos aprender simplesmente
E/S assíncrona
De fato, no nível do sistema operacional, existem apenas dois métodos de E/S, bloqueados e não bloqueados
No modelo de bloqueio, o aplicativo precisa aguardar a conclusão da E/S antes de retornar o resultado. Sua característica é que o meio -campista dos fundos seja chamado a aguardar o sistema para concluir todas as operações. Isso fará com que a CPU espere, em vez de retornar imediatamente após a chamada de bloqueio.
Eu estava lendo um livro quando era iniciante, mas senti que não estava claramente descrito aqui. Além disso, o modelo assíncrono é realmente muito grande, apenas uma melhoria no nível de sentimento. Deixe -me dar um exemplo simples
Agora tenho uma exibição de aplicativo de uma página de dois aplicativos de uma página. Quando procuro, preciso pesquisar em vários canais. Shenzhen precisa ligar para terceiros, e o terceiro obtém dados de canais específicos.
Claro que é muito lento neste momento. Se eu cortar diretamente de A a B e B para carregar dados, não haverá problema, mas agora o problema é que preciso de efeitos de animação ao mudar de A para B.
Isso exige que a renderização do Bview tenha terminado durante o processo de comutação e, pelo menos, não será enviado para o processo para obter os dados e começar a renderizar. Portanto, o assíncrono pode não ser tão fácil de usar. Mesmo que os dados sejam solicitados de forma assíncrona, os dados devem ser obtidos antes que a página possa ser carregada.
Isso ainda está bloqueado para carregar, não há como fazer isso nos negócios
Nenhuma tecnologia é perfeita, o bloqueio faz com que a CPU esteja esperando ser desperdiçada, a lógica não bloqueadora de interrupções, também pode exigir a pesquisa para confirmar se a carga foi concluída (eu costumava usar a pesquisa para detectar se um DOM foi gerado)
O NodeJS adota um mecanismo de loop de eventos. Quando o processo começar, o nó criará um loop morto. Cada processo de execução do corpo do loop é um carrapato. O processo de cada tick é para ver se há eventos que precisam ser processados.
Se houver, remova o evento relacionado, execute -o e digite a próxima lógica. Se não houver, saia do loop
Durante cada processo de tick, há um ou mais observadores em cada loop de eventos. O processo de julgar se existe um evento a ser processado é perguntar a esses observadores se o evento precisa ser processado.
Pegue nosso modelo de evento HTML como exemplo
Para HTML, de fato, cada um de seus DOM é um observador. O DOM da página observa as alterações da nossa página da web. Depois de fornecermos um addEventListener a um DOM, registraremos uma função de retorno de chamada. Os eventos que registramos serão colocados em um objeto "contêiner". Neste momento, é apenas um registro. Essas funções serão acionadas após atender às condições (quando a página mudar) e os eventos relacionados serão retirados do contêiner para execução.
Agora clicamos em um ponto da página uma vez e, em seguida, retiramos a coleção de eventos de clique no contêiner. Encontraremos os DOMs relevantes e, em seguida, desencadearemos as funções de retorno de chamada desses DOMs.
Os eventos podem vir de cliques de usuário ou alterações de dados. No nó, os eventos vêm principalmente de solicitações de rede e E/S de arquivo. Esses eventos terão observadores correspondentes, como observadores de arquivos e observadores de rede.
Este também é um modelo típico de produção/consumo, E/S assíncrono, solicitações de rede para fornecer produção de eventos, os eventos são passados a vários observadores, eventos de registro de observadores e loops de eventos são responsáveis por eliminar eventos e, em seguida, executar eventos
PS: Pegue clique como exemplo. Cada observador DOM primeiro registra o evento, o processo da página monitora constantemente a página, o usuário clica no evento de produção da página e, em seguida, o evento de cliques registrado é retirado do contêiner e executado.
A lógica da função geral é controlada por nós:
A cópia do código é a seguinte:
var foreach = function (list, retorno de chamada) {
for (var i = 0, len = list.length; i <len; i ++) {
retorno de chamada (lista [i], i, list);
}
}
No caso de assíncrono, a função de retorno de chamada não é mais controlada pelo desenvolvedor. Cada vez que uma chamada JS é iniciada, um objeto de solicitação de produto de transição será gerado.
A cópia do código é a seguinte:
fs.open = function (caminho, sinalizadores, modo, retorno de chamada) {
bingding.open (pathmodule._makelong (caminho), stringtoflags (sinalizadores), modo, retorno de chamada);
};
O FS.OPEN abre um arquivo com base no caminho e nos parâmetros para obter dados relevantes. A interface relacionada ao C ++ é chamada internamente, e um objeto intermediário será gerado durante o processo, e todos os nossos estados serão incluídos ...
PS: Eu não me sinto bem depois de assistir por tanto tempo
Conclusão
O exposto acima é sobre E/S assíncrona nos nodejs. Resumo pessoal, se houver omissões ou erros, aponte -os.