1. O papel do node.js,
O significado da E/S (E/S é a abreviação de entrada/saída, como: o texto do tipo de teclado, a entrada e o texto é exibido na tela. O mouse se move, o mouse é movido, o mouse é movido na tela, a entrada do terminal e a saída vista. Etc.)
O problema que o Node.js deseja resolver (entrada do processo, alta concorrência. Por exemplo, pode haver milhões de jogadores em jogos on-line e milhões de entradas, etc.) (o Node.js é adequado para a categoria: Node.js é mais adequado quando um aplicativo precisa enviar e receber dados na rede.
O significado da simultaneidade (o termo simultaneidade descreve que as coisas acontecerão ao mesmo tempo e podem interagir entre si.
E/S da rede de demonstração
Código JS
var http = requer ('http'), urls = ['www.baidu.com', 'www.10jqka.com.cn', 'www.duokan.com']; function fetchpage (url) {var start = new Date (); http.get ({host: url}, function (res) {console.log ("obteve resposta de:" + url); console.log ("solicitação tomada:", new Date () - start, "ms");}); } for (var i = 0; i <urls.length; i ++) {fetchPage (urls [i]); }Nomeado node.js
Nós executamos node node.js no terminal
Saída:
Exigimos o Node.js para acessar três URLs e relatar a resposta recebida e o tempo necessário.
Podemos ver que o tempo de saída é diferente para as duas vezes. Afetado por vários fatores, o tempo para resolver solicitações de DNS, programas de servidores ocupados etc.
Por que JavaScript é uma linguagem orientada a eventos
O JavaScript gira em torno da arquitetura do evento que foi originalmente associada ao modelo de objeto de documentos (DOM). Os desenvolvedores podem fazer as coisas quando os eventos ocorrem. Esses eventos incluem usuários clicando em um elemento, a página completa o carregamento, etc. Usando eventos, os desenvolvedores podem escrever ouvintes para eventos que são acionados quando ocorrem eventos.
2. Retorno de chamada
1. O que é um retorno de chamada
2. Analise o retorno de chamada
Um retorno de chamada refere -se à aprovação de uma função como um argumento para outra função e geralmente é chamado após a conclusão da primeira função.
Exemplo: por exemplo, o método hide () em jQuery,
Código JS
1, $ ("P"). Hide ('Slow'); 2, $ ("P"). Hide ('Slow', function () {alert ("O parágrafo agora está oculto")});Os retornos de chamada são opcionais.
1 Nenhum retorno de chamada é necessário
2. Há um retorno de chamada. Quando o parágrafo estiver oculto, ele será chamado, mostrando um prompt de alerta.
Para ver a diferença entre o código com e sem retornos de chamada
Código JS
$ ("P"). Hide ('Slow'); alerta ("o parágrafo está agora oculto"); // 1 $ ("p"). hide ('lento', function () {alert ("o parágrafo está agora oculto")}); // 21. Não há retorno de chamada e a ordem de execução é a mesma. No entanto, podemos ver que o parágrafo P não foi completamente oculto, o alerta sai.
2. Há um retorno de chamada e a execução é feita após a conclusão da ocultação.
Analise os retornos de chamada
Código JS
function hasbreakfast (comida, bebida, retorno de chamada) {console.log ('tendo barakfast de' + comida + ',' + bebida); if (retorno de chamada && typeof (retorno de chamada) === "function") {retorno de chamada (); }} HaveBreakfast ('Foast', 'Coffee', function () {console.log ('café da manhã acabado. Hora de ir trabalhar!');});Saída:
Tendo barakfast de espuma, café da manhã com cafeteira. Hora de ir para o trabalho!
Aqui está uma função criada com três parâmetros, o terceiro parâmetro é o retorno de chamada, que deve ser uma função.
A função Hakbreakfast registra o que você come no console e chama a função de retorno de chamada passada como um parâmetro.
Como usar retornos de chamada para node.js
Exemplo de uso do módulo de sistema de arquivos para ler o conteúdo do arquivo do disco em node.js
Código JS
var fs = requer ('fs'); fs.readfile ('somefile.txt', 'utf8', function (err, dados) {if (err) tiro err; console.log (data);});O resultado é: o conteúdo em algum arquivo.txt.
1. O módulo FS (sistema de arquivos) é solicitado para uso no script
2. O caminho do arquivo no sistema de arquivos é fornecido como o primeiro parâmetro do método FS.Readfile.
3. O segundo parâmetro é UTF8, o que indica a codificação do arquivo
4. Forneça a função de retorno de chamada como o terceiro parâmetro para o método FS.Readfile
5. O primeiro parâmetro da função de retorno de chamada é ERR, que é usado para salvar o erro retornado ao ler o arquivo.
6. O segundo parâmetro da função de retorno de chamada é acertá -lo e o usuário salva os dados retornados pelo arquivo de leitura.
7. Depois que o arquivo for lido, o retorno de chamada será chamado.
8. Se Err for verdadeiro, um erro será lançado.
9. Se Err for falso, os dados do arquivo podem ser usados.
10. Nesse caso, os dados serão registrados no console.
Outro é o módulo HTTP, o módulo HTTP permite que os desenvolvedores criem clientes e servidores HTTP.
Código JS
var http = requer ('http'); http.get ({host: 'shapeshed.com'}, function (res) {console.log ("obtive resposta:" + res.statuscode);}).Resultado: Recebido: 200
1. Solicite o módulo HTTP para uso no script
2. Forneça dois parâmetros ao método http.get ()
3. O primeiro parâmetro é o objeto de opção. Neste exemplo, você precisa obter a página inicial do shapeshed.com
4. O segundo parâmetro é uma função de retorno de chamada com a resposta como parâmetro
5. Quando o servidor remoto retornar a função correspondente, a função de retorno de chamada será acionada.
6. Registre o código de status da resposta na função de retorno de chamada. Se houver algum erro, você poderá gravá -lo.
Em seguida, vamos ver que 4 operações de E/S diferentes estão acontecendo, todas elas usam retornos de chamada
Código JS
var fs = requer ('fs'), http = requer ('http'); http.get ({host: 'www.baidu.com'}, function (res) {console.log ("Baidu.com");}). fs.readfile ('somefile.txt', 'utf8', function (err, dados) {if (err) tiro err; console.log ("algum arquivo");}); http.get ({host: 'www.duokan.com'}, function (res) {console.log ("duokan.com");}). fs.readfile ('somefile2.txt', 'utf8', function (err, dados) {if (err) tiro err; console.log ("algumfile2");});Podemos saber qual operação retorna primeiro?
O palpite é que os dois arquivos lidos no disco são retornados primeiro, porque não há necessidade de entrar na rede, mas é difícil para nós dizer qual arquivo retornará primeiro, porque não sabemos o tamanho do arquivo. Para a aquisição de duas páginas domésticas, o script precisa entrar na rede e o tempo de resposta depende de muitas coisas imprevisíveis. O processo Node.js não sairá até que haja um retorno de chamada registrado que não tenha sido acionado. Os retornos de chamada primeiro resolvem a imprevisibilidade e também é uma maneira eficiente de lidar com a simultaneidade (ou fazer mais de uma coisa de cada vez).
Aqui estão os resultados da minha execução
Código síncrono e assíncrono
Primeiro, olhe para o código, sincronize (ou bloqueie) o código
Código JS
função sono (milissegundos) {var start = new date (). gettime (); while ((new Date (). getTime () -start) <Milhõesesonds) {}} função fetchPage () {console.log ('Página de busca'); Sleep (2000); console.log ('dados retornados da página solicitando'); } function fetchapi () {console.log ('busca de api'); Sleep (2000); console.log ('dados retornados da API'); } fetchPage (); fetchapi ();Quando o script estiver em execução, a função FetchPage () será chamada. Até retornar, a execução do script está bloqueada. Antes que a função FetchPage () retorne, o programa não pode ser movido para a função Fetchapi (). Isso é chamado de operação de bloqueio.
O Node.js quase nunca usa esse estilo de codificação, mas chama os retornos de chamada de forma assíncrona.
Veja o código a seguir,
Código JS
var http = requer ('http'); function fetchpage () {console.log ('página de busca'); http.get ({host: 'www.baidu.com', path: '/? atraso = 2000'}, function (res) {console.log ('dados retornados da página solicitando');}). ('Erro', function (e) {console.log ("houve um erro" + e); } function fetchapi () {console.log ('busca de api'); http.get ({host: 'www.baidu.com', path: '/? atraso = 2000'}, function (res) {console.log ('dados retornados da solicitação de api');}). ('erro', function (e) {console.log ("houve um erro" + e); } fetchPage (); fetchapi ();Quando esse código é permitido, você não aguarda mais a função FetchPage () retornar, e a função Fetchapi () será chamada imediatamente. O código é bloqueado usando retornos de chamada. Uma vez chamados, ambas as funções ouvem o retorno do servidor remoto e acionam a função de retorno de chamada.
Observe que a ordem de retorno dessas funções não pode ser garantida, mas está relacionada à rede.
Loop de eventos
O Node.js usa o loop de eventos do JavaScript para apoiar o estilo de programação assíncrono que ele defende. Basicamente, o loop do evento permite que o sistema salve a função de retorno de chamada primeiro e depois seja executado quando o evento ocorre no futuro. Isso pode ser um banco de dados de retorno de banco de dados ou uma solicitação HTTP. Como a execução da função de retorno de chamada é adiada até que o evento seja revertido, não há necessidade de interromper a execução e o fluxo de controle pode retornar ao ambiente de tempo de execução do nó, permitindo que outras coisas aconteçam.
O Node.js é frequentemente considerado uma estrutura de programação de rede porque foi projetada para lidar com a incerteza nos fluxos de dados na rede. O que contribui para esses designs são loops de eventos e uso de retornos de chamada, e eles são como programadores que podem escrever código assíncrono que responde aos eventos de rede ou E/S.
As regras a serem seguidas são: a função deve retornar rapidamente, a função não deve ser bloqueada e as operações de longa duração devem ser movidas para outro processo.
O que não é adequado para o Node.js inclui o processamento de grandes quantidades de dados ou a execução de cálculos por um longo tempo. O Node.js foi projetado para enviar dados na rede e concluí -los instantaneamente.