gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:35:58 25 4
gpt4 key购买 nike

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 的第二部分,我将使用 dojo.io.script.get(jsonpArgs) 执行 JSONP 请求。 .这将返回 Deferred对象,我可以通过链接 .then 来利用它之后。请注意,我为 .then 定义了处理程序输出捕获的事件 data到控制台。

但是,我在控制台中得到的只是 Event .我试图搜索它的数据树,但找不到我期望的数据。


  • JSONP 请求的响应存储在哪里?我如何找到它?
  • 我的服务器(由我控制)只输出所请求数据的纯文本渲染,包装在 callback 中。函数(此处指定为 recover ),并指定一个 application/json MIME 类型。我还需要在我的服务器上设置什么,以便响应数据被 Deferred 捕获目的?

  • 尝试的解决方案

    我实际上可以通过定义回调函数来恢复响应(在本例中为 recover,在 JavaScript 的第三部分)。但是,在 Dojo 教程中,他们只是使用 Deferred 恢复了数据。 (和 .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) ,我得到一个数组 Object s。如果我直接查询 Twitter,这就是我在明文中得到的。每个 Object包含常用的推文元数据,如用户名、时间、用户画像和推文本身。很容易。

    这一击击中了我的头。 .then 的处理程序chain 是一个匿名函数,只接收一个参数 data .但为什么 results房产在 console.log(data) 我从 console.log(data.results) 得到的返回对象是 不同 ?

    最佳答案

    我知道了。

    手动回调实现

    function recover(data) {
    console.log(data);
    }

    var jsonpArgs = {
    url: "http://myapp.appspot.com/query",
    content: {
    id: "1234",
    name: "Juan",
    start_date: "2000-01-01",
    callback: "recover"
    };

    dojo.io.script.get(jsonpArgs);

    这是我的服务器将收到的请求:
    http://myapp.appspot.com/query?id=1234&name=Juan&start_date=2000-01-01&callback=recover

    在这种情况下,我希望我的服务器有以下输出:
    recover({
    id: 1234,
    name: Juan,
    data: [
    ["2000-01-01", 1234],
    ["2000-01-02", 5678]
    ]
    });

    需要注意的三件事:
  • 服务器将期待 callback在查询 URL 字符串中。 callback实现为 jsonpArgs 的属性.
  • 因为我指定了 callback=recover ,我的服务器将附加 recover( + the_data_I_need + ) , 将整个字符串返回给浏​​览器,浏览器会执行 recover(the_data_I_need) .这意味着...
  • 例如,我必须定义 function recover(one_argument_only) {doAnythingYouWantWith(one_argument_only)}

  • 这种方法的问题是我无法利用 Deferred使用 .then 链接.例如:
    dojo.io.script.get(jsonpArgs).then(function(response_from_server) {
    console.log(response_from_server);
    })

    这会给我一个 Event ,完全没有预期响应的痕迹。

    利用 Dojo 的 JSONP 请求实现
    var jsonpArgs = {
    url: "http://myapp.appspot.com/query",
    callbackParamName: "callback",
    content: {
    id: "1234",
    name: "Juan",
    start_date: "2000-01-01"
    };

    dojo.io.script.get(jsonpArgs);

    这是我的服务器将收到的请求:
    http://myapp.appspot.com/query?id=1234&name=Juan&start_date=2000-01-01&callback=some_function_name_generated_by_dojo

    在这种情况下,我希望我的服务器有以下输出:
    some_function_name_generated_by_dojo({
    id: 1234,
    name: Juan,
    data: [
    ["2000-01-01", 1234],
    ["2000-01-02", 5678]
    ]
    });

    注意事项:
  • 注意 jsonpArgs 的属性, callbackParamName .此属性的值必须是服务器期望的变量名称(在查询 URL 字符串中)。如果我的服务器需要 callbackfoo ,然后 callbackParamName: "callbackfoo" .就我而言,我的服务器需要名称 callback ,因此 callbackParamName: "callback" .
  • 在前面的示例中,我在查询 URL callback=recover 中指定了并着手实现 function recover(...) {...} .这一次,我不需要担心了。 Dojo 将插入自己的首选函数 callback=some_function_name_generated_by_dojo .
  • 我想some_function_name_generated_by_dojo定义为:

  • 定义:
    function some_function_name_generated_by_dojo(response_from_server) {
    return response_from_server;
    }

    当然定义没有那么简单,但是这种方式的好处是可以利用Dojo的Deferred框架。请参阅下面的代码,它与前面的示例相同:
    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]
    ]
    }

    关于dojo - 在 Dojo JSONP 请求之后,响应存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8847573/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com