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

How do I get the GET response outside of the ajax request?

我正在尝试将 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.

这里有情侣。

首先是您正在尝试的解构。在处理响应的匿名函数范围内,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)
}