Eu Devo Utilizar const ou let?
Quando decido se utilizo const ou let, você precisa sempre utilizar const. Porque a maioria do sue código será uso de instâncias da própria classe, objetos ou valores que não mudam, você deve utilizar const nessas situações.
Mesmo as instâncias de objetos que tenham propriedades que possam mudar pode ser declarada com const, porque const significa que a referência é apenas leitura, mas seu valor não é imutável.
Node também tem promises e generators nativos. Promises são suportados por várias bibliotecas, permitindo você escrever código assíncronos com um estilo fluente de interface.
Você provavelmente está familiarizado com interfaces fluentes: se você já utilizou uma API como o jQuery ou até mesmo arrays do JavaScript, você já sabe do que estou falando.
O exemplo a seguir mostra como ligar chamadas para manipular um array no JavaScript:
[1, 2, 3]
.map(n => n * 2)
.filter(n => n > 3);
Generators são utilizados para dar a programação síncrona o estilo da assíncrona I/O. Se você quer ver um exemplo de generators no Node na prática, veja a aplicação Koa (https://koajs.com/). Se você utilizar promises ou outro generators com Koa, você pode produzir valores ao invés de aninhar callbacks.
Um recurso útil do ES2015 no Node é o template strings. No ES5, string literais não suportam interpolação ou múltiplas linhas. Agora utilizando o símbolo de crase (), você pode inserir valores e pequenas strings em várias linhas. Isso é útil para aplicativos web:
this.body =
<div>
<h1>Olá daqui do Node</h1>
<p>Bem-vindo, ${user.name}!</p>
</div>
`;
Utilizando o ES5, fazendo o mesmo código anterior ficaria assim:
this.body = ‘\n’;
this.body += ‘<div>\n’;
this.body += ‘ <h1>Olá daqui do Node</h1>\n’;
this.body += ‘ <p>Bem-vindo, ‘ + user.name + ‘ </p>\n’;
this.body += ‘<div>\n’;
O estilo antigo utiliza mais código e tem mais chance de introduzir bugs. O grande recurso final, que é importante para programadores Node, é a arrow functions. Arrow functions deixa você melhorar a sintaxe.
Por exemplo, se você escrever um callback que tem um simples argumento e retorna um valor, você pode escrever com poucas linhas:
[1, 2, ,3].map(v => v * 2);
No Node precisamos de dois argumentos, porque o primeiro argumento é um callback é muitas vezes um objeto error. Nesse caso, você precisa utilizar parênteses entre os argumentos:
const fs = require(‘fs’);
fs.readFile(‘package.json’, (err, text) => console.log(‘Length:’, text.length));
Se você precisar utilizar mais de uma linha no corpo da função, você precisa utilizar colchetes. O valor da arrow functions não é apenas na melhoria da sintaxe, isso se ajusta com o escopo do JavaScript.
No ES5 e antes, definíamos funções dentro de outras funções utilizando o this como referência para ser tornar um objeto global. Vamos ver um exemplo que sofre um problema de bug:
1 2 3 4 5 6 7 8 9 10 11 12 |
function User(id) { // constructor this.id = id; } User.prototype.load = function() { var self = this; var query = 'SELECT * FROM users WHERE id = ?'; sql.query(query, this.id, function(err, users) { self.name = users[0].name; }); }; |
Na linha que tem a declaração self.name não pode escrever this.name, porque a função this será um objeto global. Uma gambiarra utilizada para designar um a variável para o this é na entrada da função ou método pai.
Mas as arrow functions faz isso corretamente. No ES2015, o exemplo anterior pode ser reescrito de forma mais intuitiva:
1 2 3 4 5 6 7 8 9 10 11 |
class User { constructor(id) { this.id = id; } load() { const query = 'SELECT * FROM users WHERE id = ?'; sql.query(query, this.id, (err, users) => { this.name = users[0].name; }); }} |
Não só você pode utilizar a const para modelar melhor a database query, mas também não precisa fazer uma gambiarra com a variável self. ES2015 tem muitos outros recursos que faz o código Node mais legível, mas vamos ver o que é isso no Node e como ele se relaciona aos recursos de I/O.
Deixe um comentário