Multiplas Consultas Simultaneas com NodeJS

30 views
Skip to first unread message

Nicolas Fontes

unread,
Aug 15, 2013, 3:28:13 PM8/15/13
to nod...@googlegroups.com
Fala Pessoal, Seguinte, to com um problema aqui que com certeza muito de vocês ja passaram por isso.
Preciso fazer uma consulta, dentro dela começa la um for necessário. E esse for, faz com que o valor de uma variavel mude. Ai dentro do for ainda faço outra consulta. 
Problema: NodeJS é assíncrono então quando ele chega para fazer a consulta, não espera o retorno e já vai para o próximo numero do FOR.
Sendo que não podia acontecer isso, pois o numero vai mudar e terei que fazer outra consulta com o valor de variavel diferente agora.

Ex: Busco uma turma de uma escola. Depois de pegar a turma tenho um for vou de 0 até 10. Esse numero do for aumenta um dia na data. Então no caso hoje seria 15/08 16/08 17/08 e assim vai.. E para cada data dessa faço uma consulta na base de eventos para verificar se há evento dessa turma nessa data. Quando chega nessa ultima busca ele nao aguarda o retorno do BD. Ele vai pro proximo numero do for e ja faz outra busca e fica assim. 
Ai como resultado estou verificando de quando nao haver evento da turma nessa data, ele retornar a data. E para isso ta retornando somente a ultima data. Mais uma prova que ele faz o for primeiro de tudo.. pra depois validar a consulta..

Alguem ja passou algo assim? Como devo proceder?

David Lojudice Sobrinho

unread,
Aug 15, 2013, 5:37:46 PM8/15/13
to nod...@googlegroups.com
Se eu entendi certo, vc precisa de uma função para criar um contexto
para a variável que está mudando... (aka closure wrapper)

Exemplo em CoffeeScript:
http://coffeescript.org/#try:for%20num%20in%20%5B1..10%5D%0A%20%20do(num)%20-%3E%0A%20%20%20%20leDadosTurma%20num

2013/8/15 Nicolas Fontes <nicolas...@exla.com.br>:
> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "NodeJS
> Brasil" dos Grupos do Google.
> Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie
> um e-mail para nodebr+un...@googlegroups.com.
> Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



--
__________________

David L. S.
dals...@gmail.com
__________________

Ricardo Tomasi

unread,
Aug 15, 2013, 5:42:57 PM8/15/13
to nod...@googlegroups.com

É sempre muito mais fácil ajudar vendo código.


A princípio, parece que está faltando manter o contexto dentro de cada iteração, já que um for não cria um novo escopo:


for (var i = 0; i < ln; i++) {
    (function(i){
        asyncCoisa(function(){
            console.log(i)
        })
    })(i)
}


// ES6
for (let i = 0; i < ln; i++) {
    asyncCoisa(function(){
        console.log(i)
    })
}


Se tu estiver fazendo esse tipo de operação com frequência, é melhor começar a pensar em uma biblioteca de flow-control, como https://github.com/caolan/asynchttps://github.com/mbostock/queue ou promises.


--
Ricardo Tomasi
Sent with Airmail

Nicolas Fontes

unread,
Aug 16, 2013, 8:38:48 AM8/16/13
to nod...@googlegroups.com
Pessoal Desculpa o modo que expliquei. Não 100% Objetivo. 
Estou fazendo minhas consultas usando NodeJS e Mongoose.
Preciso fazer 3 consultas, mas uma depende do resultado da anterior.

David Lojudice Sobrinho

unread,
Aug 16, 2013, 12:02:58 PM8/16/13
to nod...@googlegroups.com
Imagino que a cadeia de callbacks resolveria. Pode mostrar código?

Como o Ricardo falou, pode usar libs de flow-control ou promises. Eu
já usei o module Q https://github.com/kriskowal/q para me ajudar em um
problema bem semelhante ao que vc tem agora. Recomendo.

2013/8/16 Nicolas Fontes <nicolas...@exla.com.br>:
> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "NodeJS
> Brasil" dos Grupos do Google.
> Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie
> um e-mail para nodebr+un...@googlegroups.com.
> Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



Reply all
Reply to author
Forward
0 new messages