Как получить ответ GET вне запроса ajax? - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь сохранить результаты запроса Socrata Query Language или 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 голосов
/ 24 мая 2018

Пара готачей здесь.

Во-первых, с разрушением, которое вы пытаетесь.В области действия анонимной функции, в которой вы обрабатываете ответ, 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)
}
...