Fluxo de controle assíncrono elegante com IcedCoffeeScript

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.

Fluxo assíncrono em IcedCoffeeScript

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.