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
预期响应
如果我直接使用浏览器地址栏查询我的服务器,我将收到,application/json
在浏览器中呈现的 MIME 类型和纯文本,如下所示:
recover(
{
id: 1234,
name: Juan,
data: [
["2000-01-01", 1234],
["2000-01-02", 5678]
]
}
);
问题
现在,回顾 JavaScript 的第二部分,我将使用dojo.io.script.get(jsonpArgs)
. 这会返回一个Deferred
对象,我可以通过链接它来利用.then
它。请注意,我为.then
事件定义了处理程序,以将捕获的内容输出data
到控制台。
但是,我在控制台中得到的只是一个Event
. 我试图搜索它的数据树,但我找不到我期望的数据。
问题
- JSONP 请求的响应存储在哪里?我如何找到它?
- 我的服务器(由我控制)仅输出请求数据的明文呈现,包装在
callback
函数中(此处指定为recover
),并指定application/json
MIME 类型。我还需要在我的服务器上设置什么,以便Deferred
对象捕获响应数据吗?
尝试的解决方案
我实际上可以通过定义回调函数来恢复响应(在这种情况下recover
,在 JavaScript 的第三部分)。但是,在 Dojo 教程中,他们只是使用Deferred
(and .then
) 框架恢复了数据。我如何使用 Dojo 来做到这一点Deferred
?
更新(使用 Dojo 教程中的 Twitter 示例)
以 Dojo 教程Getting Jiggy With 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)
,我得到一个 s 数组Object
。如果我直接查询 Twitter,这就是我得到的明文。每个都Object
包含通常的推文元数据,如用户名、时间、用户画像和推文本身。很容易。
这一击正中我的头。链的处理程序.then
,一个匿名函数,只接收一个参数data
。但是为什么我从中得到的属性和返回的results
对象console.log(data)
不同呢?console.log(data.results)