Я делаю просьбу 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
. Какая-то идея как делать это?
Или просто ты можешь объявлять изменчивая номер вне события 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);
});
То, что он перемещает тебя, что, когда ты пробуешь соглашаться на стоимость 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);
Твоя проблема не доступ к переменной, твоя проблема - момент, в котором ты соглашаешься, ввиду того, что просьба 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);
});
});
Поскольку уже они прокомментировали тебе, язык сценариев JavaScript функционирует асинхронным, не последовательным способом как большинством языков программирования. Именно по этой причине обычно используют много callbacks в этом языке.
В действительности, просьба AJAX, которую ты делаешь, и alert(num)
они работают в тот же период времени. Именно поэтому стоимость num
будьте undefined
.
Решения не так широки, но большинство существующие подаст нас в широком ранге ситуаций. Давайте видеть какие-то.
Делать просьбу синхронный 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];
Использовать 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'
});
Использовать глобальные переменные - плохая идея. По мере того, как твое приложение / Веб растет и ты добавляешь librerías/frameworks, растет риск столкновения переменных, что увеличивает риск плохого функционирования и тяжелого очищения. Кроме того, если они используются плохо, он мог бы освобождать memory leak.
Использовать namespace - простое решение этой проблемы. namespace - место, где хранятся различные данные, связанные между собой (как в C#). В языке сценариев JavaScript мы не располагаем ими nativamente, но можем состязаться их посредством глобального объекта, который он хранил бы в относительных данных. Например:
window.ventas = {
desc: 0.25,
iva: 0.18,
hacerAlgo() {
}
}
Здесь мы создали namespace, который содержит стоимость и даже, функция, которая они соответствуют namespace продаж. Хотя мы это добавляем к глобальному scope, он гораздо более чистый и безопасный делать это таким образом.
потому что ты не пробуешь что-то с Промисе де Хаваскрипт в 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>