2013-08-13 3 views
0

En JavaScript frontale, j'ai une fonction funcA qui exécute normalement dès que le client reçoit un message particulier A.Conditionnellement exécution de la fonction de délai

Il est possible que le serveur envoie un autre message Bavant en envoyant A. Lorsque cela se produit, le client recevra deux messages: d'abord B puis A, et une autre fonction funcB (déclenchée par B) sera exécutée avant funcA.

Maintenant, est-il une façon élégante de retarder l'exécution de funcA lors de la réception A, si funcB exécute d'abord?

Certains pseudo-code ci-dessous pour illustrer l'idée:

... 

// called upon receiving msg `A` 
// but need to delay its execution if receiving `B` and executing funcB first 
function funcA(param) { 
    ... 
} 

// called upon receiving msg `B` 
function funcB(param) { 
    ... 
} 

... 

// receiving messages from server 

var msg = JSON.parse(...); 

if (msg.type === 'A') { 
    funcA(msg.data); 
} 
else if (msg.type === 'B') { 
    funcB(msg.data); 
} 
else if (msg.type === 'C') { 
    ... 
} 

// deal with other types of message 
... 

Je peux penser à utiliser la combinaison d'un « drapeau » et chèque conditionnelle avant chaque exécution de funcA, ce qui ne semble pas très élégant pour moi.

S'il vous plaît noter: cette question est pas sur la façon de retarder l'exécution d'une fonction (qui est habituellement obtenue en utilisant setTimeout), au contraire, il demande un modèle de conception/structure donnée une logique de code particulier.

+0

Quel code avez-vous maintenant? Pouvez-vous le montrer? – putvande

+3

Programmation et élégance ne sont pas toujours les meilleurs amis. L'utilisation d'un drapeau dans ce cas est parfaitement acceptable. Je le ferais sans considération dans ce scénario. – Archer

+0

façon si vous avez un message B ne pas mettre meassage A dans le cadre de l'appel B seulement funcB avec funcA callback –

Répondre

2

Vous avez besoin d'un moyen de garder une trace si funcB a été appelé, vous pouvez vérifier que l'intérieur funcA et laissez-le s'appeler avec un retard:

var funcBCalled = false; 

function funcB() { 
    funcBCalled = true; 
    // do something... 
} 

function funcA() { 
    if (funcBCalled) { 
    funcBCalled = false; 
    window.setTimeout(funcA, 1000); 
    } else { 
    // do something 
    } 
} 
Questions connexes