如何在ajax请求之外获得GET响应?

时间:2018-05-24 05:32:13

标签: ajax socrata

我正在尝试将Socrata查询语言或SoQL查询的结果保存到我可以在其他地方使用的变量中。我想我明白,由于ajax的异步性质,我不能指望在$ .ajax()。done()块之外可用的值,但我无法理解如何从中获取值块。

let gasAve;
let settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://data.colorado.gov/resource/xyh2-p9cg.json?%24select=avg(allgradesgasprice)&%24where=date%20between%20'2017-01-01T12%3A00%3A00'%20and%20'2017-12-31T11%3A59%3A59'",
  "method": "GET",

}

$.ajax(settings).done(function (response) {
  console.log(response); // logs [Object {avg_allgradesgasprice="2.4292307692307692"}]
  let [{"avg_allgradesgasprice":gasAve}] = response; // destructure the object
  console.log(gasAve); // Within the block, I get the value 2.429....
});

console.log(gasAve); // Outside of the block I get undefined.

1 个答案:

答案 0 :(得分:1)

夫妻俩来了。

首先是你正在尝试的解构。在您处理响应的匿名函数的范围内,let重新声明gasAve。这与原始声明是分开的,因此从未将值分配给您的第一个gasAve声明。如果构造操作中的let将在您期望的范围内正确分配值,那么摆脱它。

其次,处理响应的函数是异步执行的,即在进行ajax调用并收到响应之后。匿名声明之外的console.log在按时间顺序分配值之前执行。避免此问题的简单方法是在响应处理函数的上下文中或从调用它的函数中完成所有工作。像这样:

let gasAve;
let settings = {
    "async": true,
    "crossDomain": true,
    "url": "https://data.colorado.gov/resource/xyh2-p9cg.json?%24%24app_token=gNqVzSHJ7pWovzVu8pRHdiMHe&%24select=avg(allgradesgasprice)&%24where=date%20between%20'2017-01-01T12%3A00%3A00'%20and%20'2017-12-31T11%3A59%3A59'",
    "method": "GET",
}

$.ajax(settings).done(function (response) {
        console.log(response); // logs [Object {avg_allgradesgasprice="2.4292307692307692"}]
        [{"avg_allgradesgasprice":gasAve}] = response; // destructure the object
        console.log(gasAve); // Within the block, I get the value 2.429....
        displayStuff();
    });

function displayStuff() {
    console.log(gasAve)
}