2010-03-20 8 views
0

Voir par exemple:appelée fonction A (args) appelle une fonction B() qui appelle ensuite une fonction A (args), Comment faire cela?

<!DOCTYPE html> 
<html> 

    <head> 
     <title>language</title> 
     <script type="text/javascript" src="http://www.google.com/jsapi"> 
     </script> 
    </head> 

    <body> 

     <div id="language"></div> 

     <script type="text/javascript"> 

      var loaded = false; 

      function load_api() { 

       google.load("language", "1", { 
        "nocss": true, 
        "callback": function() { 
         loaded = true; 
         callback_to_caller(with_caller_agruments); 
         // how to call a function (with the same arguments) which called load_api() ??? 
         // case 1 should be: detect_language('testing'); 
       // case 2 should be: translate('some text');      
        } 
       }); 
      } 

      function detect_language(text) { 
       if (!loaded) { 
        load_api(); 
       } else { 
        // let's continue... believe that google.language is loaded & ready to use 
        google.language.detect(text, function(result) { 
         if (!result.error && result.language) { 
          document.getElementById('language').innerHTML = result.language; 
         } 
        }); 
       } 
      } 

      function translate(text) { 
       if (!loaded) { 
        load_api(); 
       } else { 
        // let's continue... 
       } 
      } 

      detect_language('testing'); // case 1 
      translate('some text'); // case 2 
     </script> 
    </body> 

</html> 

Répondre

1

Vous devez passer l'appelant et des arguments à load_api, sinon comment pourrait-il connaître les valeurs des variables non pertinentes?

 function load_api(f, text) { 
     ... 

     function detect_language(text) { 
      if (!loaded) { 
       load_api(detect_language, text); // or use load_api(arguments.callee, text) 

Et puis vous pouvez invoquer ceux dans le rappel.

   "callback": function() { 
        loaded = true; 
        f(text); 

Si A est variadique, vous pouvez utiliser la variable arguments et Function.apply:

function A (x, y, z) { 
    B(A, arguments); // or B(A, [x, y, z]) 
} 
function B (f, arr) { 
    setTimeout(1000, function() { 
    f.apply(this, arr); 
    }); 
} 
+0

merci pour une solution. Comment être si les fonctions/appelants ont un nombre différent d'instruments? – Ken

+1

@Ken: Voir mise à jour. – kennytm

1

Si vous appelez google.load plus d'une fois, il est assez intelligent de ne pas inclure le script encore une fois, mais votre rappel sera toujours appelé. Ainsi, vous pouvez juste faire:

function load_api(callback) { 

    google.load("language", "1", { 
     "nocss": true, 
     "callback": callback 
    }); 
} 

function detect_language(text) { 
    load_api(function() { 
     // let's continue... believe that google.language is loaded & ready to use 
     google.language.detect(text, function(result) { 
      if (!result.error && result.language) { 
       document.getElementById('language').innerHTML = result.language; 
      } 
     }); 
    }); 
} 

function translate(text) { 
     load_api(function() 
     { 
      // Do whatever you want, including using text. 
     }); 
} 

Notez que en raison des travaux de fermeture de façon, vous pouvez utiliser librement les arguments de la fonction dans votre rappel. Mais vous trouverez peut-être plus simple d'avoir un seul rappel au chargement de la page et de masquer les contrôles de traduction jusqu'à la fin du rappel.

Questions connexes