Изменчивые глобальные javascript

Я делаю просьбу AJAX, которая возвращает мне один json, и я нуждаюсь в том, чтобы использовать стоимость json вне функции AJAX, хоть бы, что данные были публичными или глобальными, и я не добиваюсь, как делать это.

Это мой код:

$('#btnBusca').on("click",function () {

    var cod_sec = $('#txtcodsec').val();
    var fecha = new Date;
    var ano = fecha.getFullYear();
    var mes = fecha.getMonth();
    var num;

    $.ajax({
        type: 'GET',
        data: {cod_sec: cod_sec,mes: mes, ano: ano},
        url: 'pagina.php',

        success: function (data) {
            var parsedData = JSON.parse(data);
            num = parsedData[0].NUMERO;


        },
        error: function () {
            alert('Error peticion Ajax ');
        }
    });
    alert(num);
});

Я хочу использовать стоимость переменной num вне функции $.ajax. Какая-то идея как делать это?

1
задан 15.09.2016, 18:37
5 ответов

Или просто ты можешь объявлять изменчивая номер вне события click

var num;
$('#btnBusca').on("click",function () {

  var cod_sec = $('#txtcodsec').val();
  var fecha = new Date;
  var ano = fecha.getFullYear();
  var mes = fecha.getMonth();


  $.ajax({
      type: 'GET',
      data: {cod_sec: cod_sec,mes: mes, ano: ano},
      url: 'pagina.php',

      success: function (data) {
          var parsedData = JSON.parse(data);
          num = parsedData[0].NUMERO;
      },
      error: function () {
          alert('Error peticion Ajax ');
      }
  });
  alert(num);
});
1
ответ дан 24.11.2019, 13:22

То, что он перемещает тебя, что, когда ты пробуешь соглашаться на стоимость num еще он не доступен.

var ajax = function(cb) {
  $.ajax({
    type: 'GET',
    url: 'pagina.php',
    success: cb
  });
}

// callback para la llamada ajax
var callback = function(data, textStatus, xor) {
  var parsedData = JSON.parse(data);
  num = parsedData[0].NUMERO;
}

ajax(callback);
0
ответ дан 24.11.2019, 13:22

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

$('#btnBusca').on("click",function () {

    var cod_sec = $('#txtcodsec').val();
    var fecha = new Date;
    var ano = fecha.getFullYear();
    var mes = fecha.getMonth();
    var num;

    $.ajax({
        type: 'GET',
        data: {cod_sec: cod_sec,mes: mes, ano: ano},
        url: 'pagina.php',

        success: function (data) {
            var parsedData = JSON.parse(data);
            num = parsedData[0].NUMERO;


        },
        error: function () {
            alert('Error peticion Ajax ');
        }
    }).done(function(){

       alert(num);
    });

});
1
ответ дан 24.11.2019, 13:22
  • 1
    спасибо, функционируй. Но сейчас поскольку я делаю, чтобы использовать переменную " num" в новой функции вне ajax? – daniel2017- 15.09.2016, 18:45
  • 2
    Глобальные переменные - обычно плохая идея, но ты можешь использовать window.num = номер; чтобы сохранять глобальный разум, и равный, чтобы соглашаться на нее alert (window.num); – Jesus Angulo 15.09.2016, 18:48

Поскольку уже они прокомментировали тебе, язык сценариев JavaScript функционирует асинхронным, не последовательным способом как большинством языков программирования. Именно по этой причине обычно используют много callbacks в этом языке.

В действительности, просьба AJAX, которую ты делаешь, и alert(num) они работают в тот же период времени. Именно поэтому стоимость num будьте undefined.

Решения

Решения не так широки, но большинство существующие подаст нас в широком ранге ситуаций. Давайте видеть какие-то.

  1. Делать просьбу синхронный AJAX (твоя самая худшая альтернатива): это решение состоит просто в добавлении ключа async со стоимостью false в параметрах просьбы:

    let response = $.ajax({
        type: 'GET',
        url: 'destino',
        async: false
    }).responseText;
    // añadiendo la variable a window se hace global
    window.num = JSON.parse(response)[0];
    
  2. Использовать polyfill, чтобы использовать будущие характеристики языка: С помощью Вавилона мы можем использовать будущие характеристики языка сценариев JavaScript, как это это Async/Await посредством этого plugin:

    let response = await $.ajax({ /* ... */ });
    // o usando la API fetch
    let response = await fetch({
        method: 'GET',
        body: { ... },
        accept: 'application/json',
        'Content-Type': 'application/json'
    });
    

Namespaces

Использовать глобальные переменные - плохая идея. По мере того, как твое приложение / Веб растет и ты добавляешь librerías/frameworks, растет риск столкновения переменных, что увеличивает риск плохого функционирования и тяжелого очищения. Кроме того, если они используются плохо, он мог бы освобождать memory leak.

Использовать namespace - простое решение этой проблемы. namespace - место, где хранятся различные данные, связанные между собой (как в C#). В языке сценариев JavaScript мы не располагаем ими nativamente, но можем состязаться их посредством глобального объекта, который он хранил бы в относительных данных. Например:

window.ventas = {
  desc: 0.25,
  iva: 0.18,
  hacerAlgo() {

  }
}

Здесь мы создали namespace, который содержит стоимость и даже, функция, которая они соответствуют namespace продаж. Хотя мы это добавляем к глобальному scope, он гораздо более чистый и безопасный делать это таким образом.

0
ответ дан 24.11.2019, 13:22

потому что ты не пробуешь что-то с Промисе де Хаваскрипт в jQuery. Здесь я оставляю тебе объяснение кода.

// Declaras un Promise
var num = $.Deferred().promise(); 
//Ejecutamos el promise con el when, y solicitamos por el get la URL que vamos a consumir, cuando se ejecute este GET entonces pasamos dos functiones que es: Exito y Fallo
$.when($.get('http://jsonplaceholder.typicode.com/post/1')).then(exito,fallo);

function exito(data) {
   num = data;
   console.log("Tuvo éxito : " + num.userId);
 }
function fallo() {
   console.log("El promisse responde, no traje datos");
 };

//Con el metodo state(); puedes saber si tu promise aun este pendiente.
alert(num.state());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
0
ответ дан 24.11.2019, 13:22