вызываемая функция A (args) вызывает функцию B (), которая затем вызывает функцию A (args). Как это сделать? - PullRequest
0 голосов
/ 20 марта 2010

См. Пример:

<!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>

Ответы [ 2 ]

1 голос
/ 20 марта 2010

Если вы вызываете google.load более одного раза, он достаточно умен, чтобы не включать скрипт снова, но ваш обратный вызов все равно будет вызван. Таким образом, вы можете просто сделать:

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.
        });
}

Обратите внимание, что из-за способа работы замыканий вы можете свободно использовать аргументы функции в вашем обратном вызове. Но вам может оказаться проще просто иметь один обратный вызов при загрузке страницы и скрывать все элементы управления переводом, пока обратный вызов не завершится.

1 голос
/ 20 марта 2010

Вам нужно передать вызывающую и аргументы в load_api, иначе как он может узнать значения нерелевантных переменных?

        function load_api(f, text) {
         ...

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

И затем вы можете вызвать их в обратном вызове.

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

Если A - переменная, вы можете использовать переменную arguments и 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);
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...