Escrever código Node.js para interagir com serviços externos (bancos de dados, e-mail, http, etc.) pode facilmente se tornar um “inferno de callback” complicado.
Embora haja vários módulos de controle assíncronos por aí, como o excelente async , a maioria deles pode ser um pouco exagerado para os padrões de uso mais comuns.
No entanto, se você não é um purista do JavaScript e se preocupa com a legibilidade do código e a velocidade de desenvolvimento, o IcedCoffeeScript pode poupá-lo de uma quantidade incrível de problemas.
Aqui está apenas um exemplo rápido do mundo real – o código vem de LeasingSH.ro , um projeto construído inteiramente em Node.js:
method: 'get'
route: ///
-
(
[A-Z]
[A-Z|\d]{2}
\d{5}
)
\.html$
///
callback: (req, res, next) ->
[ uid ] = req.params
query = Product.findOne uid: uid
if req.isAuthenticated() and req.user.isSalesman
query.populate
path: 'dealer'
select: 'name phone email address'
await query.lean().exec defer err, product; return next err if err or not product?
categoryKey = product.category.key
errors = {}
await
helpers.loadSpecialProducts categoryKey, 10, defer errors.specialProducts, specialProducts
Product.find()
.select('uid make model price year').slice('pictures', 1)
.where('isActive').equals(yes)
.where('isSold').equals(no)
.where('category.key').equals(categoryKey)
.limit(5)
.lean().exec defer errors.suggestedProducts, suggestedProducts
for own operation, err of errors
return next err if err
res.render 'public/product', {
pageType: 'product'
product
specialProducts, suggestedProducts
}
Depois de esperar para ler as informações do produto, estamos executando duas consultas paralelas para ler informações adicionais (produtos especiais e sugeridos).
Realmente não pode ser mais fácil do que isso …
A beleza de combinar Node.js com IcedCoffeeScript é que você está realmente obtendo o melhor de dois mundos:
- A velocidade e capacidade de lidar com conexões simultâneas características do Node.js – devido à sua natureza baseada em eventos, o servidor pode processar outra coisa (ou seja, outra solicitação de entrada) enquanto aguarda a conclusão de uma operação em segundo plano;
- A legibilidade e concisão do CoffeeScript (semelhante ao Ruby), aprimorada ainda mais pela maneira elegante do Iced CoffeeScript de lidar com retornos de chamada.