javascript обещания, просьбы ajax ()

Привет,

Я занимаю много времени сражаясь с проблемой, которую я не могу решать, надеюсь, что они могут помогать мне, проверил много руководителей на callback и обещания, но мне не удается решить мою проблему.

Главным образом я нуждаюсь в том, чтобы реализовать просьбу $ .ajax (), которая приносит мне данные, позже в цикле iterativo из-за каждой информации реализовала другую консультацию $ .ajax () в другую таблицу, в конце концов я нуждаюсь в том, чтобы использовать данные об обоих консультациях, чтобы наполнять две договоренности и посылать их как аргументы функции.

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

я оставляю им код, который я реализую (я работаю с jquery):

// Funcion para traer datos adicionales por cada registro
function funcionAsync(urlDestino){
  // La función devuelve una Promise
    return new Promise(function(resolver, rechazar){
        jQuery.ajax({
          url: urlDestino,
          success : function(data){resolver(data)},
          error : function(error){rechazar(error)}
        });    
    });
}

// Funcion principal para solicitar datos con Ajax
function TraeDatosConAjax(){

var datos1 = [], datos2 = [];
var urlPrincipal = $("#urlPrincipal").val(); // URL Base

$.getJSON(urlPrincipal+'MetodoTraeDatos1') // Primera peticion Ajax
  .then(function(respuesta) {
    labelx = "";

    for (var i = 0; i < respuesta.length; i++) {
        ini = respuesta[i].ini_semana; // fecha inicial
        fin = respuesta[i].fin_semana; // fecha final
        var datos = "";

        labelx = abreviaRangoFechas(ini, fin); // Funcion que abrevia el rango de fechas
        // Llenamos el primer array (datos1) con datos (SE LLENA SIN PROBLEMAS)
        datos1.push({
            y: parseInt(respuesta[i].cant_capacidad), label: labelx, s: respuesta[i].id_semana,
        });

        // Llenaremos datos2 con la funcion asincrona
        datos = funcionAsync(urlPrincipal+'MetodoTraeDatos2/'+respuesta[i].id_semana+'/')
        .then(function(datosDevueltos){
            if ($.isNumeric(datosDevueltos[0].cantprog_progweek)) {valor = datosDevueltos[0].cantprog_progweek;}else{valor = 0;}
            // lleno el segundo array con datos de la segunda peticion (ACA TENGO EL PROBLEMA PARA LLENAR EL ARRAY)
            /********************************************************/
            datos2.push({
                y: parseInt(valor), label: labelx,
            });
            /********************************************************/
            return valor;
        }, function(errorLanzado){
          // Aquí el código para hacer algo cuando ocurra un error.
          alert("Fallo!!!");
        });
        //alert("Fuera: "+datos); //return datos1; // LO EXTRAÑO ES QUE SI LE QUITO EL COMENTARIO A ESTE ALERT() OBTENGO LOS DATOS QUE NECESITO
    }
    // Aca necesito asignar ambos array (datos1 y datos2) como argumento de "GraphAreaGeneric" * DATOS1 SE CARGA SIN PROBLEMAS, DATOS2 SE CARGA SOLO SI DESCOMENTO EL ALERT()*
    GraphAreaGeneric(datos1, datos2);
    //return datos1;
  })
}
4
задан 05.01.2017, 09:03
0 ответов

Проблема находится, в котором просьбы AJAX асинхронные, когда ты делаешь GraphAreaGeneric(datos1, datos2); вне функции очень вероятно, что datos1 и datos2 они не были загружены еще.

Tenés два решения проблемы:

  1. Помещать решение GraphAreaGeneric(datos1, datos2); внутри .then() оставаясь таким:

    $.getJSON(urlPrincipal+'MetodoTraeDatos1') // Primera peticion Ajax
    .then(function(respuesta) {
        labelx = "";
    
        for (var i = 0; i < respuesta.length; i++) {
            ini = respuesta[i].ini_semana; // fecha inicial
            fin = respuesta[i].fin_semana; // fecha final
            var datos = "";
    
            labelx = abreviaRangoFechas(ini, fin); 
            datos1.push({
                y: parseInt(respuesta[i].cant_capacidad), label: labelx, s: respuesta[i].id_semana,
        });
    
        // Llenaremos datos2 con la funcion asincrona
        funcionAsync(urlPrincipal+'MetodoTraeDatos2/'+respuesta[i].id_semana+'/')
        .then(function(datosDevueltos){
            if ($.isNumeric(datosDevueltos[0].cantprog_progweek)) {valor = datosDevueltos[0].cantprog_progweek;}else{valor = 0;}
            // lleno el segundo array con datos de la segunda peticion (ACA TENGO EL PROBLEMA PARA LLENAR EL ARRAY)
            /********************************************************/
            datos2.push({
                y: parseInt(valor), label: labelx,
            });
            /********************************************************/
            GraphAreaGeneric(datos1, datos2);
            datos = valor;
        }, function(errorLanzado){
          // Aquí el código para hacer algo cuando ocurra un error.
          alert("Fallo!!!");
        });
    
    }
    
  2. Делать просьбу AJAX используя функцию $.ajax() с асинхронным дезактивированным способом, они это объясняют очень довольно здесь. Как в нижнем комментарии очень хорошо сказал пользователь rnd этот выбор не рекомендуется, так как он затрагивает конечный опыт пользователя.

Я надеюсь помочь тебе.

Комментируй нам, как он ты пошел пожалуйста!

5
ответ дан 03.12.2019, 17:52
  • 1
    Относительно выбора 2: дезактивировать асинхронный способ склоняется к тому, чтобы ухудшать опыт пользователя, которым интерфейс может быть блокированным. –  05.01.2017, 12:54
  • 2
    Я olvidé осветления этого! Спасибо за комментарий! –  05.01.2017, 19:19
  • 3
    Спасибо за твой rá попросите ответ. Estube реализовывая доказательства согласно решению 1, который ты показываешь мне, и действительно поместив решение GraphAreaGeneric (datos1, datos2); внутри .then (), он загружает мне правильно данные. Проблема, которая я появляется, состоит в том, что данные, которых приносит функция funcionAsync () прибывают приведенные в беспорядок. ¿ какая-то идея как упорядочивать их?... снова agradesco твой ответ. выбор 2 не использовал ее, итак, как он говорит " rnd" они не рекомендуют ее. –  05.01.2017, 21:51
  • 4
    Я радуюсь, что он подал тебя! Не entendí который ты имеешь в виду с " desordenados"? –  05.01.2017, 22:00
  • 5
    Внутри цикла for () из-за каждого реестра, с функцией funcionAsync () я ищу информацию, присоединенную в каждый пойдите, проблема состоит в том, что, когда я показываю данные, они приведены в беспорядок (информация не соответствует id, что старательное). Поскольку я прочитал это, нормально, чтобы произошла с существом асинхронная функция, и также я прочитал, что это может контролировать с чем-то как: setTimeout (function () { }, 0 | Math.random () * 100); но правда я не нашел формы. Я надеюсь, что понимают. –  05.01.2017, 22:22

Теги

Похожие вопросы