Dojo JSONP请求之后,响应存储在哪里? JavaScript
例如,我有以下JavaScript代码(Dojo 1.6已经加载): 从浏览器直接查询 我知道我的服务器将收到查询,就好像我在地址栏中键入了以下内容一样:Dojo JSONP请求之后,响应存储在哪里? JavaScript,dojo,jsonp,deferred,Dojo,Jsonp,Deferred,例如,我有以下JavaScript代码(Dojo 1.6已经加载): 从浏览器直接查询 我知道我的服务器将收到查询,就好像我在地址栏中键入了以下内容一样: http://myapp.appspot.com/query?id=1234&name=Juan&start_date=2000-01-01&callback=recover 预期反应 如果我使用浏览器地址栏直接查询我的服务器,我将在浏览器中呈现的MIME类型application/json和纯文本中收到如下内容:
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的第二部分,我将使用dojo.io.script.get(jsonpArgs)
执行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;
});
然而,我在控制台中得到的只是一个事件
。我试图搜索它的数据树,但找不到我期望的数据
问题:
JSONP请求的响应存储在哪里?我怎么找到它
我的服务器(由我控制)仅输出请求数据的纯文本呈现,包装在回调
函数中(此处指定为恢复
),并指定应用程序/json
MIME类型。是否需要在我的服务器上设置其他内容,以便延迟对象捕获响应数据
尝试解决方案
我实际上可以通过定义回调函数来恢复响应(在本例中,JavaScript第三部分中的recover
)。但是,在Dojo教程中,他们只是使用延迟
(和.then
)框架恢复了数据。我如何使用DojoDeferred
s来实现它
更新(使用Dojo教程中的Twitter示例)
以Dojo教程中的这个脚本为例。我对其进行了编辑,以将数据记录到控制台
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)
,我得到一个对象
,而不是一个事件
,如我的案例所示。由于该示例意味着数据驻留在data.results
中,因此我也尝试浏览此树,但没有从Twitter上看到预期的数据。我不知所措
对于console.log(data.results)
,我得到一个对象的数组。如果我直接查询Twitter,这就是我用明文得到的结果。每个对象
都包含常用的推文元数据,如用户名、时间、用户肖像和推文本身。很简单
这个正好打在我的头上。.then
链的处理程序是一个匿名函数,它只接收一个参数数据
。但是为什么console.log(data)
中的results
属性与我从console.log(data.results)
得到的返回对象不同呢?我得到了它
手动回调实现
这是我的服务器将收到的请求:
http://myapp.appspot.com/query?id=1234&name=Juan&start_date=2000-01-01&callback=recover
http://myapp.appspot.com/query?id=1234&name=Juan&start_date=2000-01-01&callback=some_function_name_generated_by_dojo
在这种情况下,我希望从我的服务器获得以下输出:
recover({
id: 1234,
name: Juan,
data: [
["2000-01-01", 1234],
["2000-01-02", 5678]
]
});
some_function_name_generated_by_dojo({
id: 1234,
name: Juan,
data: [
["2000-01-01", 1234],
["2000-01-02", 5678]
]
});
有三件事需要注意:
服务器将在查询URL字符串中预期回调
<代码>回调
作为jsonpArgs
的属性实现
因为我指定了callback=recover
,我的服务器将附加recover(
+我需要的数据)
,将整个字符串返回到浏览器,浏览器将执行recover(我需要的数据)
。这意味着
例如,我必须定义函数recover(仅一个参数){doAnythingYouWantWith(仅一个参数)}
这种方法的问题是,我无法利用延迟的链接。例如:
dojo.io.script.get(jsonpArgs).then(function(response_from_server) {
console.log(response_from_server);
})
这将给我一个事件
,完全没有预期响应的痕迹
利用Dojo对JSONP请求的实现
这是我的服务器将收到的请求:
http://myapp.appspot.com/query?id=1234&name=Juan&start_date=2000-01-01&callback=recover
http://myapp.appspot.com/query?id=1234&name=Juan&start_date=2000-01-01&callback=some_function_name_generated_by_dojo
在这种情况下,我希望从我的服务器获得以下输出:
recover({
id: 1234,
name: Juan,
data: [
["2000-01-01", 1234],
["2000-01-02", 5678]
]
});
some_function_name_generated_by_dojo({
id: 1234,
name: Juan,
data: [
["2000-01-01", 1234],
["2000-01-02", 5678]
]
});
注意事项:
注意jsonpArgs
,callbackParamName
的属性。此属性的值必须是服务器期望的变量名称(在查询URL字符串中)。如果我的服务器需要callbackboo
,那么callbackParamName:“callbackboo”
。在我的例子中,我的服务器需要名称callback
,因此callbackParamName:“callback”
在上一个示例中,我在查询URLcallback=recover
中指定,并继续实现函数recover(…){…}
。这一次,我不需要担心。Dojo将插入它自己的首选函数callback=some\u function\u name\u由\u Dojo生成
我想象由dojo生成的某个函数名被定义为:
定义:
function some_function_name_generated_by_dojo(response_from_server) {
return response_from_server;
}
当然,定义并没有那么简单,但这种方法的优点是我可以利用Dojo的延迟框架。请参见下面的代码,该代码与前面的示例相同:
dojo.io.script.get(jsonpArgs).then(function(response_from_server) {
console.log(response_from_server);
})
这将为我提供所需的准确数据:
{
id: 1234,
name: Juan,
data: [
["2000-01-01", 1234],
["2000-01-02", 5678]
]
}
定义回调实际上就是它的工作方式,如本页的JSONP和dojo一章所述:。你指的是其他什么教程?@Philippe,这是我指的教程。它确实解释了如何定义回调函数,但当我遵循Twitter示例时(即使没有定义回调函数),它也能正常工作。我拨弄。然后
链,将其连接到处理程序函数(数据)
,以便它执行console.log(数据)
。实际上,我可以浏览数据树并在那里找到Twitter搜索结果。将当前回调函数中的内容放在这里。@Philippe:好的,我刚刚添加了load:recover
t