2017-09-20 2 views
0

Je construis une extension Firefox en utilisant la nouvelle norme de webextension. Lorsque l'utilisateur clique n'importe où sur la page, je souhaite mettre le clic en veille pendant quelques millisecondes pendant qu'une autre fonction exécute une tâche dans le script d'arrière-plan.javascript addEventListener et runtime.onMessage.addListener

Voici une partie de mon code:

script contenu :

var CanContinue = false; 
browser.runtime.onMessage.addListener(MsgListener); 

function MsgListener(request, sender, sendResponse) 
{ 
    if (request.msg == 'can_continue') 
     CanContinue = true; 
} 

function ClickDetected(event) 
{ 
    browser.runtime.sendMessage({"msg": "doWork"}); 
    while (! CanContinue); 
} 

window.addEventListener("click", function(event) { 
    ClickDetected(event); 
}, true); 

script fond :

browser.runtime.onMessage.addListener(MsgListener); 

function MsgListener(msg) 
{ 
    if (msg.msg == 'doWork') 
    { 
     ... 
     browser.tabs.sendMessage(TheTabId, {msg: 'can_continue'}); 
    } 
} 

Le problème est que le script de contenu ne reçoit pas le message can_continue alors que l'événement click est en attente, de sorte que le while (! CanContinue) ne jamais publier.

Notez que le message est correctement reçu si je le teste en dehors du processus d'événement click.

Répondre

2

JavaScript est monothread et la messagerie est asynchrone.

while (! CanContinue); signifie tous votre code va juste se bloquer. La réponse est prête et est dans la file d'attente des événements, mais ne sera pas traitée tant que votre code actuel ne sera pas terminé.

Vous ne pouvez pas "retarder" l'exécution de cette façon; vous ne pouvez pas "attendre" une réponse asynchrone.

Vous pouvez essayer de contourner le problème en annulant l'événement, puis en le relançant après confirmation. Je ne suis pas sûr si cela fonctionnerait en termes de "geste de l'utilisateur" si.

+0

Merci, je vais essayer de cette façon – user3429139