Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
var procedimentos = new Array();
procedimentos['a'] = false;
procedimentos['b'] = false;
var executarFuncaoFinal = function(){
var mostrarResultado = true;
for(var i in procedimentos){
if(!procedimentos[i]){
mostrarResultado = false;
}
}
if(mostrarResultado){
//TODO o que fazer quando ambos A e B forem executados.
alert('resultado');
}
}
var a = function(){
procedimentos['a']=true;
executarFuncaoFinal();
}
var b = function(){
procedimentos['b']=true;
executarFuncaoFinal();
}
a();
b();
talvez esse exemplo nao seja o melhor, mas na verdade a e b sao insercoes em um banco de dados e o callback eh a resposta, eu quero saber se a funcao que A e B estao chamando eh acessada ao mesmo tempo ou se ela fica travada se 1 dos 2 esta usando ela. No exemplo acima acho que ta bem sincrono entao parece obvio que o a sera executado e depois o b, me corrijam caso eu esteja enganado.
Lembrando que o que esta acima eh somente um exemplo, o cenario que estou trabalhando a e b sao funcoes que farao ligacoes com o banco de dados.
eu poderia executar a, e no callback de a executar b, so que fica uma gambi um dentro do outro, e eu vou ter a , b, c e d chamando uma funcao x que vai analizar se a, b , c e d estao corretos...
eu uso node JS no servidor, e os dados chegam ate ele por socket. O exemplo que eu citei acima eh sincrono, mas imagine a mesma situacao assincrona.
A lib eh node-mysql, ela efetua a conexao com o banco e retorna os dados em callbacks, somente dentro deles eu tenho acesso ao que voltou do banco. Vou pesquisar mas tenho quase certeza que e assincrono.
Obrigado pela resposta.
OBS.: o que eu estou escrevendo acontece no servidor, nao no cliente.
talvez a pergunta certa seria:
se 2 metodos assincronos acessarem um terceiro metodo ao mesmo tempo, o terceiro seria executado simultaneamente pelos 2 ou primeiro 1 depois o outro, tipo, ao mesmo tempo eu quero dizer que enquando o primeiro call estiver executando o 3 metodo, o segundo call tbm executalo.
mega gambiarra.
se 2 metodos assincronos acessarem um terceiro metodo ao mesmo tempo,
tecnicamente, nunca é ao mesmo tempo.Quem for chamado antes, começaria a executar o terceiro antes, ne?!
o terceiro seria executado simultaneamente pelos 2 ou primeiro 1 depois o outro,
se fossem bloqueantes, a segunda chamada ao terceiro só seria executada qndo a primeira voltar.
Se não, ocorreria assincrono, em paralelo, certo ?
>
tipo, ao mesmo tempo eu quero dizer que enquando o primeiro call estiver executando o 3 metodo, o segundo call tbm executalo.
provavelmente seria esse o comportamento sim. Eu acho.
bom, ficou assim agora, eu sei que esta horrivel, caso alguem tenha alguma ideia, me avise :D/>
var codigoPedido = null;
var sendResponse = function(){
//selecionando o pedido
var query = "SELECT p.* , t.ddd , t.numero FROM pedidos p INNER JOIN telefones t ON p.fk_telefones=t.id WHERE p.id="+codigoPedido;
app.connection.query(query , function(err , pedido){
if(!err){
if(pedido.length > 0){
//selecionando os produtos do pedido
socket.emit('novoPedido_answer' , pedido[0]);
} else {
socket.emit('novoPedido_answer' , false);
}
} else {
console.log(err.message);
socket.emit('novoPedido_answer' , false);
}
});
}
var helper = pedido.orderProducts;
var checkStatus = function(i , j){
/*
i = orderProduct,
j = complemento
*/
if(j==undefined){
helper[i].produto = true;
} else {
helper[i].complementos[j] = true;
}
var send = true;
for(var i in helper){
if(helper[i].complementos.length > 0){
for(var j in helper[i].complementos){
if(helper[i].complementos[j]!==true){
send = false;
}
}
}
if(helper[i].produto!==true){
send = false;
}
}
if(send){
console.log("produto criado com sucesso");
sendResponse();
}
}
var gravarComplementos = function(complemento , id , i , j){
/*backup_ped_t_prod_cat_t_comp
fk_pedidos_tem_produtos -- campo que armazenara o codigo do pedido em questao
fk_complementos -- campo que armazenara o/os complementos do produto
*/
//sera chamado se existirem complementos para o produto
var query = "INSERT INTO backup_ped_t_prod_cat_t_comp(fk_pedidos_tem_produtos , fk_complementos) VALUES("+id+","+complemento+")";
app.connection.query(query , function(err , data){
if(!err){
//aqui eu chamo somente o callback da funcao que sera chamada no final
helper[i].complementos[j] = true;
checkStatus(i , j);
} else {
console.log(err.message);
}
});
}
var gravarProdutos = function(pedidoId){
[spoiler]
for(var i in pedido.orderProducts){
(function(i){
var query = "INSERT INTO pedidos_tem_produtos(quantidade , fk_produtos , fk_pedidos) VALUES ("+pedido.orderProducts[i].quantidade+","+pedido.orderProducts[i].produto.codigo+","+pedidoId+")";
app.connection.query(query , function(err , data){
if(!err){
checkStatus(i);
for(var j in pedido.orderProducts[i].complementos){
//talvez isso aqui nunca ocorra, eh opcional
gravarComplementos(pedido.orderProducts[i].complementos[j].codigo , data.insertId , i , j);
}
} else {
console.log(err.message);
}
});
})(i)
}
}
var gravarPedido = function(){
[spoiler]
if(pedido.obs.length > 0 ){
var query = "INSERT INTO pedidos(fk_clientes , fk_enderecos , fk_funcionarios , fk_telefones , obs) VALUES ("+pedido.cliente.codigo+","+pedido.endereco.codigo+","+Models.onlineUsers[socket.id].id+","+pedido.endereco.codigo+","+pedido.obs+")";
} else {
var query = "INSERT INTO pedidos(fk_clientes , fk_enderecos , fk_funcionarios , fk_telefones) VALUES ("+pedido.cliente.codigo+","+pedido.endereco.codigo+","+Models.onlineUsers[socket.id].id+","+pedido.endereco.codigo+")";
}
app.connection.query(query , function(err , data){
if(!err){
codigoPedido = data.insertId;
gravarProdutos(data.insertId);
} else {
console.log(err.message);
socket.emit('novoPedido_answer' , false );
}
});
}
gravarPedido();
Resumo da gambi:
Grava o pedido
-> para cada produto, insere com o id do pedido recem gerado
-> checka se ta na hora de mandar a resposta
->para cada produto, insere complementos, se existirem
-> para cada complemento, checka se ta na hora de mandar resposta
esse checkar se ta na hora de mandar a resposta que eh o cara que vai ser acessado infinitas vezes por o que vier do banco
você tem ou não tem ajax ?
se não tiver, é sincrono. Com certeza.
Se tiver ajax, depende se você configurou ou não o ajax para assincrono.
Está usando js puro ? ou alguma lib ?