JavaScript
Например, у меня есть следующий код JavaScript (Dojo 1.6 уже загружен):
dojo.require("dojo.io.script")
// PART I
var jsonpArgs = {
url: "http://myapp.appspot.com/query",
content: {
id: "1234",
name: "Juan",
start_date: "2000-01-01",
callback: "recover"
}
};
// PART II
dojo.io.script.get(jsonpArgs).then(function(data) {
console.log(data);
});
// PART III
function recover(data) {
console.log(data);
}
Прямой запрос из браузера
Я понимаю, что мой сервер получит запрос, как будто я набрал в адресной строке следующее:
http://myapp.appspot.com/query?id=1234&name=Juan&start_date=2000-01-01&callback=recover
Ожидаемый ответ
Если я напрямую запросил свой сервер с помощью адресной строки браузера, я получу в формате MIME application/json
и в виде открытого текста в браузере что-то вроде этого:
recover(
{
id: 1234,
name: Juan,
data: [
["2000-01-01", 1234],
["2000-01-02", 5678]
]
}
);
Задача
Теперь, оглядываясь на вторую часть JavaScript, я выполнил бы запрос JSONP с dojo.io.script.get(jsonpArgs)
. Это возвращает Deferred
объект, которым я могу воспользоваться, добавив .then
после него. Обратите внимание, что я определил обработчик для события .then
, который выводит на консоль data
.
Однако все, что я получаю в консоли - это Event
. Я попытался найти его дерево данных, но не смог найти ожидаемые данные.
Вопрос
- Где хранится ответ на запрос JSONP? Как мне это найти?
- Мой сервер (которым я управляю) только выводит текстовые данные запрошенных данных, обернутые в функцию
callback
(здесь указывается как recover
), и задает тип application/json
MIME. Есть ли что-то еще, что мне нужно настроить на моем сервере, чтобы данные ответа захватывались объектом Deferred
?
Попытка решения
Я действительно могу восстановить ответ, определив функцию обратного вызова (в данном случае recover
в части III JavaScript). Однако в руководствах по Dojo они просто восстанавливали данные с использованием инфраструктуры Deferred
(и .then
). Как мне это сделать с помощью Dojo Deferred
s?
Обновление (на примере Twitter из учебника по Dojo)
Взять, к примеру, этот скрипт из учебника по Dojo, Получение Jiggy с JSONP . Я отредактировал его для записи данных на консоль.
dojo.require("dojo.io.script");
dojo.io.script.get({
url: "http://search.twitter.com/search.json",
callbackParamName: "callback",
content: {q: "#dojo"}
}).then(function(data){
//we're only interested in data.results, so strip it off and return it
console.log(data); // I get an Object, not an Event, but no Twitter data when browsing the results property
console.log(data.results) // I get an array of Objects
return data.results;
});
Для console.log(data)
я получаю Object
, а не Event
, как показано в моем случае. Поскольку в примере подразумевается, что данные находятся в data.results
, я также пытаюсь просмотреть это дерево, но не вижу ожидаемых данных из Twitter. Я в растерянности.
Для console.log(data.results)
я получаю массив Object
с. Если я сделаю запрос в Twitter напрямую, это то, что я получу в виде открытого текста. Каждый Object
содержит обычные метаданные твита, такие как имя пользователя, время, портрет пользователя и сам твит. Достаточно просто.
Этот бьет меня прямо по голове. Обработчик цепочки .then
, анонимная функция, получает только один аргумент data
. Но почему свойство results
в console.log(data)
и возвращаемого объекта, полученного из console.log(data.results)
, отличается ?