0

Как можно получить содержимое файла или ответ сервера в глобальную переменную? В нижеследующей функции глобальная переменная после функции остаётся undefined, тогда как если вызвать alert внутри функции, то значение ей присваивается.

Мне нужно прочесть несколько файлов и послать к API сервиса с полтора десятка запросов, после чего переварить всё это. Если делать лесенкой, то в этой лесенке я и утону. Хотелось бы доставать переменную «наружу» из функции. Это возможно?

<script>
    var myVar;
    $.get("example.html", function(data) {
        myVar = data;
        alert(myVar); // всё отлично
    }, "html");
    alert(myVar);  // undefined
</script>

3 Answers3

0

Первый раз отвечаю здесь :)

$.get работает асинхронно, то есть когда вы выводите переменную myVar, то она действительно пустая.

Попробуйте так:

    var myVar;
    $.get("example.html", function(data) {
        myVar = data;
//        alert(myVar); // всё отлично
    }, "html").then(function(){
        alert(myVar);
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
0

Оказывается jquery get тоже возвращает promise, с ним можно работать так:

$.get("https://jsonplaceholder.typicode.com/todos/1").then(function (myVar) {
    console.log(myVar)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Как работать с промисами, создавать цепочку с ними можно прочитать тут.

0

Да, вы можете записать всё в один ряд используя асинхронные функции

<script>
  (async function(){
    var myVar;
    myvar=await $.get("example.html", "html");
    alert(myVar);
  })()
</script>

Интерактивный пример:

var fakeAjax=value=>new Promise(resolve=>setTimeout(()=>resolve(value),2000)),
global
(async function(){
  console.log('Wait...')
 global=await fakeAjax('Yay! It\'s inline asynchronus response!')
  console.log(global)
})()

Это будет работать с любыми promise объектами, а также с функциями, которые его возвращают ($.get одна из них).

Diskyp
  • 1,522