2010-06-22 9 views
3

Je travaille sur une extension Mozilla et j'ai un problème lorsque je fais des appels n à une fonction asynchrone, cette fonction est hors de mon contrôle et elle exécute un rappel à la fin. Dans ce rappel, je dois effectuer une action spéciale s'il s'agit du dernier rappel &. Je ne sais pas comment déterminer si un rappel est le dernier, j'ai pensé à mettre un compteur et à le décrémenter à chaque fois, mais en raison de la boucle imbriquée, je ne sais pas combien d'appels asynchrones seront faits (sans le faire à l'avance, ce qui serait inefficace). Des idées sur une approche élégante à cela?Suivre les appels asynchrones

function dataCallBack(mHdr, mimeData) 
{ 
    // ... Do stuff ... 
    // Was this the final callback? 
} 

function getData() { 
    var secSize = secList.length; 

    for (var i = 0; i < secSize; i++) { 
     if (secList[i].shares.length >= secList[i].t) { 

     var hdrCount = secList[i].hdrArray.length; 

     for(var j = 0; j < hdrCount; j++) 
     { 
        // MAKE ASYNC CALL HERE 
      mozillaFunction(secList[i].hdrArray[j], this, dataCallBack); 
     } 
     } 
    } 

} 

Merci.

Répondre

1

Vous pouvez faire quelque chose le long de ces lignes:

var requestsWaiting = 0; 
    // this will be the function to create a callback 
    function makeDataCallback() { 
    requestsWaiting++; // increase count 
    // return our callback: 
    return function dataCallBack(mHdr, mimeData) 
    { 
     // ... Do stuff ... 
     // per request - make sure that this happens in the next event loop: 
     // can be commented out if not needed. 
     setTimeout(function() { 
     // Was this the final callback? 
     if (! --requestsWaiting) { 
      // it was the final callback! 
     } 
     // can be commented out if not needed 
     },0); 
    } 
    } 

// then in your loop: 
// MAKE ASYNC CALL HERE 
mozillaFunction(secList[i].hdrArray[j], this, makeDataCallBack()); 
+0

merci. Cela semble bon, mais est-il possible qu'un rappel puisse être exécuté avant la prochaine itération de la boucle? c.-à-d. créer callback -> callback exécuté -> is_final, avant la prochaine itération de la boucle. Ou est-il garanti que requestsWaiting restera> 0 jusqu'à la dernière fonction appelée dans la boucle? –

+0

@Jason Gooner - Oui, vous pouvez envelopper le si dans un 'setTimeout (function() {' ... '}, 0);' pour lutter contre cela, va modifier dans quand pas sur mon téléphone :) – gnarf

Questions connexes