Ответ JSONP возвращает неопределенное значение, если не используется внутри функции обратного вызова JSONP - PullRequest
0 голосов
/ 26 октября 2011

Я пытаюсь получить ответ JSONP из Twitter и получить следующий код:

<!doctype html>
<html>
    <head>
    </head>
    <body>
        <script>
            (function($, container) {

                container[$] = function(url){

                    url += '&callback=jsonp';

                    var scriptEl = document.createElement('script');

                    scriptEl.setAttribute('src', url);

                    document.getElementsByTagName('head')[0].appendChild(scriptEl);

                }

                window.jsonp = function(response) {

                    return response;

                }

            })('$', this);
        </script>
        <script>
            var test = $('http://api.twitter.com/1/statuses/user_timeline.json?screen_name=jonathonoates');

        </script>
    </body>
</html>

Если вместо return response; в функции window.jsonp я должен был вставить alert(response) Iможно видеть, что я получаю успешный ответ из Twitter.

Я хотел бы return, что response, как в var test = $('http...');, но test не определено;response не возвращается.

Я уверен, что я смотрю на это глупо, возможно, это как-то связано с тем, что он находится в закрытии?

Я был бы очень признателен вампомогите с этим!

Хотя, пожалуйста, не отвечайте на jQuery и т. д., так как я хотел бы узнать, как все это делается самостоятельно.

Спасибо всем!

1 Ответ

0 голосов
/ 28 октября 2011

Из-за поведения асинхронных вызовов функция обратного вызова должна вызываться после того, как JSONP был получен из источника, в данном случае, Twitter.

Функция обратного вызова должна передаваться в качестве аргумента вместе с URL-адресом в функции $, чтобы ее можно было вызывать из функции jsonp, которая должна быть дочерней по отношению к функции $.

                url += '&callback=jsonp';

                var scriptEl = document.createElement('script');

                scriptEl.setAttribute('src', url);

                head.appendChild(scriptEl);

                container.jsonp = function(response) {

                    return callback(response);

                }

и называется как:

        function test(x) {
            alert(x);
        }

        $(test, 'http://api.twitter.com/1/statuses/user_timeline.json?screen_name=jonathonoates');
...