Помощь с использованием Mootools и JSONP

#mootools #jsonp

#mootools #jsonp

Вопрос:

Мне действительно трудно заставить это работать. Все, что мне требуется, это записать в консоль возвращаемый объект. Я вообще ничего не вижу в журнале, хотя тег script вводится в head.

JSON:

 jsonFeed({
    "results":{
        "loggedin": "No",
        "username": "",
        "company": ""
    }
});
  

JS:

 function jsonFeed() {

}

window.addEvent('domready', function() {

    new Request.JSONP({
        url: <correcturl>,
        onComplete: function(data){
            console.log(data); // Nothing returned

        }
    }).send();

});
  

Мы высоко ценим любую помощь.

Обновить

Я удалил функцию jsonFeed вверху и изменил существующий код на:

 new Request.JSONP({
    log: true,
    url: loginstatus,
    callbackKey: 'jsonFeed',
    onComplete: function(data){
        console.log(data); // Nothing returned

    }
}).send();
  

В журнале я получаю:

 JSONP retrieving script with url:http://thedomain/LoggedStatus.aspx?jsonFeed=Request.JSONP.request_map.request_0
jsonFeed is not defined
  

В это вводится:

 <script type="text/javascript" async="true" src="http://thedomain/LoggedStatus.aspx?jsonFeed=Request.JSONP.request_map.request_0"> 

-- if I expand this I see the JSON --


</script>
  

итак, а) я получаю ошибку jsonFeed not defined и б) onSuccess не запускается : (

Я действительно ценю всю вашу помощь, ребята. И я прошу прощения, если я упускаю суть: (

Обновить

добавлено:

 this.jsonFeed = function(data) {
    console.log(data);
};
  

.. и это работает. Спасибо @Dimitar

Я все еще не совсем понимаю это, но теперь это работает, это помогает при разработке.

Комментарии:

1. что firebug должен сказать? вы действительно переходите по правильному URL? каков необработанный возврат в запросе?

2. 100% это правильный URL. вводится тег <script>, и если я разверну его, то увижу JSON.

3. и… JSON начинается с фигурных { скобок, а не [name](), которые, я полагаю, вы улучшаете как вызов функции.

4. На самом деле, кажется, что onComplete вообще не запускается, так как даже если я введу «console.log(‘test’);», я не увижу журнал.

5. посмотрите firebug — видите ли вы запрос?

Ответ №1:

это не работает, потому что имя вашей функции обратного вызова игнорирует ту, которая запрашивает.Вместо этого JSONP отправляет и возвращает jsonFeed.

http://mootools.net/docs/more/Request/Request .JSONP

callbackKey (строка: по умолчанию используется обратный вызов) ключ в URL, который сервер использует для переноса результатов JSON. Итак, например, если вы использовали callbackKey: ‘обратный вызов’, то сервер ожидает что-то вродеhttp://…./?q=search termamp;callback=myFunction; Это должно быть определено правильно.

вот пример класса, который я написал, который получает информацию от flickr — которые используют пользовательский ключ обратного вызова — это нормально. http://fragged.org/mootools-flickr-api-class-via-request-jsonp_1042.html (p.s. jsfiddle может быть медленным в банкомате, в пятницу, 13-е число!)

другое дело, если удаленный сервер ПРОДОЛЖАЕТ не работать с вами и отказывается отправлять данные в правильно упакованном формате, например:

Request.JSONP.request_map.request_0({data})

затем вам действительно нужно убедиться, что

 this.jsonFeed = function(data) {
    console.log(data);
};
  

где это глобальный объект (например, window) — вы не можете охватить это, поэтому будьте осторожны с определением функции.

при выполнении последнего jsonFeed возьмет на себя роль функции обратного вызова по завершении.

это можно сделать другим способом, который сопоставит встроенную функцию обратного вызова, определенную классом, и экспортирует ее на тот, который нравится вашему удаленному хосту:

 onRequest: function() {
    var lastCallback;
    Object.each(Request.JSONP.request_map, function(el) {
        lastCallback = el;
    });
    window.jsonFlickrApi = lastCallback;
},
onComplete: function(data) {
...
}
  

Ответ №2:

 jsonFeed(
    return //or anything else that will make this piece of data recognizable on your page
    {
    "results":{
        "loggedin": "No",
        "username": "",
        "company": ""
    }
});




new Request.JSONP({
        url: <correcturl>,
        callbackKey: 'jsonFeed'
        onComplete: function(data){
            console.log(data); // Nothing returned

        }
    }).send();