Dojo JSONP请求之后,响应存储在哪里? JavaScript

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和纯文本中收到如下内容:

例如,我有以下JavaScript代码(Dojo 1.6已经加载):

从浏览器直接查询 我知道我的服务器将收到查询,就好像我在地址栏中键入了以下内容一样:

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
    )框架恢复了数据。我如何使用Dojo
    Deferred
    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”

  • 在上一个示例中,我在查询URL
    callback=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