Запрос JSONP к StackOverflow с MooTools не работает

Я пытаюсь создать собственный значок StackOverflow, используя JSONP и MooTools. Вот код:

new Request.JSONP('http://stackoverflow.com/users/flair/166325.json', {
  onComplete: function(data) {
    console.log(data);
  }
}).request();

Однако я всегда получаю это сообщение:

RequestJSONPrequest_maprequest_0 is not defined

Мне интересно, является ли это проблемой с ответом от StackOverflow, поскольку запросы к другим службам с JSONP у меня работают нормально.


person Michael Hale    schedule 01.03.2010    source источник
comment
это выглядит так, как будто синтаксический анализатор из переполнения стека удаляет . из параметра callback= json-запроса, что означает, что на стек функций обратного вызова запроса, которые хранит класс, нельзя ссылаться. при включении журнала: JSONP retrieving script with url: http://stackoverflow.com/users/flair/166325.json?callback=Request.JSONP.request_map.request_0 -> RequestJSONPrequest_maprequest_0 is not defined интересно. вы всегда можете сделать это вручную или выполнить рефакторинг Request.JSON.getScript для поддержки переопределения callback= статической функции. тестовый пример: jsfiddle.net/xS7pQ   -  person Dimitar Christoff    schedule 02.03.2010
comment
и с предопределенной функцией это работает: jsfiddle.net/xS7pQ/2   -  person Dimitar Christoff    schedule 02.03.2010


Ответы (2)


нашел способ обойти это: http://www.jsfiddle.net/CRdr6/1/

передав callbackKey: "callback=myfunc&foo" классу Request.JSONP (он не экранирован должным образом), вы можете использовать myfunc как глобальную функцию для обработки обратного вызова и обхода разделенного .

Request.stackoverflow = new Class({
    Extends: Request.JSONP,
    options: {
        log: true,
        url: "http://stackoverflow.com/users/flair/{user}.json",
        callbackKey: "callback=myfunc&foo"
    },
    initialize: function(user, options) {
        this.parent(options);
        this.options.url = this.options.url.substitute({user: user});
    },
    success: function(data, script) {
        this.parent(data, script);
    }
});


window.myfunc = function(data) {
    console.log(data);
};

new Request.stackoverflow(166325).send();
person Dimitar Christoff    schedule 01.03.2010

В итоге я создал функцию, которую вызывает StackOverflow (без точек):

var StackOverflow = Class.refactor(JsonP, {
  getScript: function(options) {
    var index = Request.JSONP.counter;
    var script = this.previous(options);
    eval("RequestJSONPrequest_maprequest_" + index + " = Request.JSONP.request_map['request_' + index];");
    return script;
  }
});
person Michael Hale    schedule 02.03.2010