Как изменить функцию обратного вызова в классе mootools Request.JSONP - PullRequest
1 голос
/ 08 сентября 2011

Я использую Request.JSONP для получения некоторых данных, но мне нужно изменить функцию обратного вызова в URL, который извлекает данные.

Используя пример в документации:

Как изменить этот вызов:

http://www.flickr.com/?format=json&jsoncallback=Request.JSONP.request_map.request_0

к этому:

http://www.flickr.com/?format=json&jsoncallback=myOwnFunction

В jQuery вы можете использовать настройку "jsonpCallback", чтобы использовать собственную функцию, но я не могу найти способ изменить ее в MooTools.

Любая помощь, идеи, будет принята с благодарностью.

Edit:

Моя проблема в том, что моя функция будет в функции setInterval, и каждый раз, когда она выполняет запрошенное изменение URL, вот так:

Обратный вызов = Request.JSONP.request_map.request_0

Обратный вызов = Request.JSONP.request_map.request_1

Обратный вызов = Request.JSONP.request_map.request_2 ... п

Мне нужно, чтобы последняя цифра не менялась (для целей кэширования)

1 Ответ

1 голос
/ 08 сентября 2011

это называется callbackKey для JSONP. читать документ .

Вот класс Flickr, который расширяет JSONP, который я написал (изменить API):

// the class
Request.flickr = new Class({
    Extends: Request.JSONP,
    options: {
        callbackKey: "jsoncallback",
        url: "http://www.flickr.com/services/rest/?",
        log: true
    },
    initialize: function(params, options) {
        this.parent(options);
        this.options.url = this.options.url + Object.toQueryString(params);
    },
    success: function(data, script) {
        this.parent(data, script);
    },
    imageURL: function(obj) {
        return "http://farm{farm}.static.flickr.com/{server}/{id}_{secret}.jpg".substitute(obj);
    }
});

// example on how to use
new Request.flickr({
    format: 'json',
    api_key: "e7df6c74d2545f55414423463bf99723", // your api here
    per_page: 4,
    tags: "mountains",
    method: "flickr.photos.search"
}, {
    onSuccess: function(data) {
        target = document.id("action");
        var self = this;
        data.photos.photo.each(function(el) {
            new Asset.image(self.imageURL(el), {
                onload: function() {
                    this.inject(target);
                }
           });
        });
    }
}).send();

Чтобы полностью переопределить обратный вызов и передать внешнюю функцию (должна быть глобальной):

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


Request.flickr = new Class({
    Extends: Request.JSONP,
    options: {       
        url: "http://www.flickr.com/services/rest/?jsoncallback=foo&",
        log: true
    },
    initialize: function(params, options) {
        this.parent(options);
        this.options.url = this.options.url + Object.toQueryString(params);
    },
    success: function(data, script) {
        this.parent(data, script);
    },
    imageURL: function(obj) {
        return "http://farm{farm}.static.flickr.com/{server}/{id}_{secret}.jpg".substitute(obj);
    }
});

// example on how to use
new Request.flickr({
    format: 'json',
    api_key: "e7df6c74d2545f55414423463bf99723",
    // your api here
    per_page: 4,
    tags: "mountains",
    method: "flickr.photos.search"
}).send();

приведенный выше код запустит функцию foo, передав ей объект JSON. http://jsfiddle.net/dimitar/DUtff/

...