Как скопировать var из функции 1 в функцию 2?

Я пытаюсь скопировать var1 из первой функции во вторую, но не получаю обратно ни одного alert().

$(document).ready(function(){
  var var1;
  $.ajax({
    url: "https://api.ipify.org?format=json",
    success: function(response) {
      var data = response;
      var1 = data.ip;
      $('#test').html(var1);
    }
  });

  // I want the var1 to be copied to the second function, to this:
  // The alert is for example, but it does not give me anything back

  $(function() {
    var var2 = var1;
    $('#test2').html(var1);

    $.ajax({
      type: 'get',
      url: "http://mywebsite.com/testip?"+var2, // just some query that i need to use with the ip from var1
      dataType: "html",
      success: function(data) {
        alert(var2);
      },
    });
  });
});

http://jsfiddle.net/evu3dat0/

Вы не можете «скопировать» локальную переменную в другую локальную переменную, не имеющую общей области видимости. Вы должны переместить одного из них в более высокий прицел, чтобы они оба могли использовать. Однако здесь также возникает вопрос, почему у вас есть два готовых документа, а не только один? $(document).ready(fn) и $(fn) - это фактически одно и то же в jQuery.

Taplar 10.08.2018 16:46

Один получает IP, а другой должен отправить запрос по адресу: mywebsite.com/testip?"+var2 с IP. Затем testip.php сохраняет запрос (var2) в текстовый файл. Другого способа сохранить var напрямую в txt файл не нашел

hixovucaw 10.08.2018 16:49

Вы не указали, почему у вас должно быть два готовых документа вместо одного. Ничто из того, что вы сказали, не требует подготовки двух документов.

Taplar 10.08.2018 16:50

Пожалуйста, всегда правильно отступать от кода вы публикуете на StackOverlow.

connexo 10.08.2018 16:51

Итак, я должен заменить $ (document) .ready на $ (function () {?

hixovucaw 10.08.2018 16:51

Просто объедините две вещи в один готовый документ. Затем переменная var1 или var2, привязанная к готовому документу, становится доступной для всей вложенной логики.

Taplar 10.08.2018 16:52

Или вы можете сделать var1 глобальным, удалив var, и он будет доступен ниже, но все же в этом случае var var2 = var1 будет работать раньше var1 = data.ip, потому что ajax займет некоторое время

anonymous 10.08.2018 16:56
0
7
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, вы должны объединить ваши документы в один, так как вам нужен только один.

Во-вторых, вы не можете выполнить логику, как вы пытались это сделать. Ajax - это асинхронный. Это означает, что вы должны запустить первый запрос и, прежде чем он завершится, вы также попытаетесь выполнить второй запрос. Поскольку для второго запроса требуются данные из первого ответа, это неверная логика.

Чтобы исправить это, вы можете вызвать второй метод ajax из успеха первого, после чего данные будут доступны для использования во втором запросе ajax.

$(document).ready(function() {
  var var1;
  
  $.ajax({
    url: "https://api.ipify.org?format=json",
    success: function(response) {
      var data = response;
      var1 = data.ip;
      $('#test').html(var1);

      //I want the var1 to be copied to the second function, to this:
      //The alert is for example, but it does not give me anything back
      $('#test2').html(var1);

      $.ajax({
        type: 'get',
        url: "http://mywebsite.com/testip?" + var1, // just some query that i need to use with the ip from var1
        dataType: "html",
        success: function(data) {
          alert(var1);
        },
      });
    }
  });
});

Да спасибо. Теперь хорошо работает. Я сначала изучу изменения

hixovucaw 10.08.2018 17:06

Другие вопросы по теме