NODE.JS Внутри названный get REST решение остается, не надеясь, что он заканчивает for

У меня есть следующая проблема: Когда я выполняю решение SQL и мне удается загрузить array, он показывает мне первого console.log с сообщением "Пропуск первый select", потом сходит за for, где у него есть другой subquery, который закончил бы загружать array, тема состоит в том, что он это перемещает из-за высоты и показывает меня console.log с конечным array, но, потом он показывает мне результат subquery, она, как который он не подождет for, чтобы заканчиваться, у них есть идея о, как он мог бы оплачивать это в тему? я пришел бы очень большого количества помощи. с уже большое спасибо и Привет.

Код:

app.get('/productos/ConfigPF', function(req, res) {
    //res.json('get Usuarios')
    let tipProd = req.query.tip_prod || 0;
    tipProd = Number(tipProd);

    let idProd = req.query.id_prod || 0;
    idProd = Number(idProd);

    let arrayprod = {} // empty Object
    let key = 'ConfiracionPF';
    // empty Array, which you can push() values into
    arrayprod[key] = [];

    queryDB(`SELECT CA.ETIQUETA, CA.NOM_FORMU , CA.ID_CAMPO,CA.TIP_CARGA,ID_CATG,ID_CAM_STOCK from tb_config_campo_pf PF,tb_config_campo CA  where pf.tip_prod = ${tipProd} and pf.id_pf = ${idProd} and pf.tip_prod = ca.tip_prod and pf.id_campo = ca.id_campo`)

        .then(
        // success
        (rs) => {
            // realizas operaciones con rs y llenas el array
            rs.forEach(function(row) {
                //console.log(row.IMAGEN);
                //Armar JSON
                var imagenf = ab2str(row.IMAGEN);

                var data = {
                    etiqueta: ab2str(row.ETIQUETA),
                    valor_col: ab2str(row.NOM_FORMU),
                    id_campo: row.ID_CAMPO,
                    valor: 0,
                    tip_carga: row.TIP_CARGA,
                    valor_combo: "0",
                    id_categ: row.ID_CATG,
                    id_cam_stock: row.ID_CAM_STOCK
                };
                arrayprod[key].push(data);
            });
            disconnectFromDB();
            console.log("Pase primer Select"); // verificas que tienes los datos

            let sqlsentencia = "";
            // realizas operaciones con tu array
            for (let i in arrayprod) {
                for (let j in arrayprod[i]) {
                    if (arrayprod[i][j].tip_carga == 1) {
                        if (arrayprod[i][j].id_cam_stock == 5)
                        {
                            sqlsentencia = `select CAMPO5 AS CAMPO from TB_ITEM_STOCK where id_categoria =  ${arrayprod[i][j].id_categ}`;
                        }

                        if (arrayprod[i][j].id_cam_stock == 6)
                        {
                            sqlsentencia = `select CAMPO6 AS CAMPO from TB_ITEM_STOCK where id_categoria =  ${arrayprod[i][j].id_categ}`;
                        }

                        if (arrayprod[i][j].id_cam_stock == 7)
                        {
                            sqlsentencia = `select CAMPO7 AS CAMPO from TB_ITEM_STOCK where id_categoria =  ${arrayprod[i][j].id_categ}`;
                        }

                        if (arrayprod[i][j].id_cam_stock == 8)
                        {
                            sqlsentencia = `select CAMPO8 AS CAMPO from TB_ITEM_STOCK where id_categoria =  ${arrayprod[i][j].id_categ}`;
                        }

                        if (arrayprod[i][j].id_cam_stock == 9)
                        {
                            sqlsentencia = `select CAMPO9 AS CAMPO from TB_ITEM_STOCK where id_categoria =  ${arrayprod[i][j].id_categ}`;
                        }

                        if (arrayprod[i][j].id_cam_stock == 10)
                        {
                            sqlsentencia = `select CAMPO10 AS CAMPO from TB_ITEM_STOCK where id_categoria =  ${arrayprod[i][j].id_categ}`;
                        }

                        queryDB(sqlsentencia)
                        .then((rs) =>   {
                            // realizas operaciones con rs y llenas el array
                            console.log("Pase segundo Select");
                            let valores = "";
                            rs.forEach(function(row) {
                                if (valores = "")
                                {
                                    valores = ab2str(row.CAMPO);
                                }
                                else
                                {
                                    valores = valores + "_";
                                    valores = valores + ab2str(row.CAMPO);
                                }

                            });
                            arrayprod[i][j].valor_combo = valores;
                            valores = "";
                            disconnectFromDB();                        
                         },
                         (err) => {
                            console.log("error");
                        }); // termina el then()
                    }
                }
            }

            console.log(arrayprod);
           // ahora ya puedes hacer uso de res.json
           res.json({
               ok: true,
               arrayprod
           });
        },
        (err) => {
            console.log("error");
        }); // termina el then()
}); // termina el app.get()
0
задан 20.03.2019, 02:35
2 ответа

Имеет смысл то, что ты комментируешь, то, что происходит, что в твоих for, укрытые ты бросаешь асинхронные консультации. Я пробую меня объяснить, из-за каждый iteraciГіn ты бросаешь query, который заканчивался, когда он будет, априори это не знаешь. Ты peticiГіn get завершен до того, как закончились твои субконсультации.

Одна soluciГіn pasarГ - за использованием Promise.all. Для этого, вместо того, чтобы for выполняет каждую консультацию в deberГЎs хранить их в array или объекте, чтобы потом выполнять их и получать ответ всех перед тем, как решать остальные:

let promises = {};

for(let i in arrayprod) {
    for(let j in arrayprod[i]) {
        ...

        promises[`${i}|${j}`] = queryDB(sqlsentencia); //Solo la guardas, no la ejecutas.
        // Lo guardamos en un objeto, el motivo por el que la clave del objeto es `i|j` 
        //es para que cuando se resuelvan las promesas, sepas que resultado corresponde a que query
    }
} //fin de los for

Сейчас, у нас есть объект со всеми обещаниями, которые даже не работали, а следовательно все cГіdigo до настоящего времени работало синхронной формы.

, Чтобы решать эти query, у нас есть Promise.all, которые направляют как parГЎmetro один array или один object:

// Fuera del los for:

Promise.all(promises)
   .then(result => {
        //result es un objeto con la siguiente estructura --> {'i1|j1' : (resultado), 'i1|j2: (resultado2), ...}
        Object.keys(result).forEach(K => {
            const [i, j] = K.split('|');

            const rs = result[K];
            let valores = '';
            rs.forEach(function(row) {
                if (valores = "")
                {
                    valores = ab2str(row.CAMPO);
                }
                else
                {
                    valores = valores + "_";
                    valores = valores + ab2str(row.CAMPO);
                }               
            });
            valores = '';
            arrayprod[i][j].valor_combo = valores;
        });
        // Aqui ya deberías tener todas las queries resueltas y podrás resolver tu petición.
         res.json({
               ok: true,
               arrayprod
           });
   }
)

Надеялся быть просветом, и что служил тебе помощью.

1
ответ дан 02.12.2019, 05:24
  • 1
    Большое спасибо LLsanchez. Я протестирую codificació n и я предупреждаю тебя – Nicolás Ovejero 21.03.2019, 02:28

Realize изменения llsanchez и он дает мне следующую ошибку:

introducir la descripción de la imagen aquí

переместил Тебя код, который я написал для этого случая, с уже большое спасибо!

КОД:

app.get('/productos/ConfigPF', function(req, res) {
    //res.json('get Usuarios')
    let tipProd = req.query.tip_prod || 0;
    tipProd = Number(tipProd);

    let idProd = req.query.id_prod || 0;
    idProd = Number(idProd);

    let arrayprod = {} // empty Object
    let key = 'ConfiracionPF';
    // empty Array, which you can push() values into
    arrayprod[key] = [];

    queryDB(`SELECT CA.ETIQUETA, CA.NOM_FORMU , CA.ID_CAMPO,CA.TIP_CARGA,ID_CATG,ID_CAM_STOCK from tb_config_campo_pf PF,tb_config_campo CA  where pf.tip_prod = ${tipProd} and pf.id_pf = ${idProd} and pf.tip_prod = ca.tip_prod and pf.id_campo = ca.id_campo`)

        .then(
        // success
        (rs) => {
            // realizas operaciones con rs y llenas el array
            rs.forEach(function(row) {
                //console.log(row.IMAGEN);
                //Armar JSON
                var imagenf = ab2str(row.IMAGEN);

                var data = {
                    etiqueta: ab2str(row.ETIQUETA),
                    valor_col: ab2str(row.NOM_FORMU),
                    id_campo: row.ID_CAMPO,
                    valor: 0,
                    tip_carga: row.TIP_CARGA,
                    valor_combo: "0",
                    id_categ: row.ID_CATG,
                    id_cam_stock: row.ID_CAM_STOCK
                };
                arrayprod[key].push(data);
            });
            disconnectFromDB();
            console.log("Pase primer Select"); // verificas que tienes los datos

            let sqlsentencia = "";
            let promises = {};

            for(let i in arrayprod) {
                for(let j in arrayprod[i]) {

                    if (arrayprod[i][j].tip_carga == 1) {

                    if (arrayprod[i][j].id_cam_stock == 5)
                    {
                        sqlsentencia = `select DISTINCT CAMPO5 AS CAMPO from TB_ITEM_STOCK where id_categoria =  ${arrayprod[i][j].id_categ}`;
                    }

                    if (arrayprod[i][j].id_cam_stock == 6)
                    {
                        sqlsentencia = `select DISTINCT CAMPO6 AS CAMPO from TB_ITEM_STOCK where id_categoria =  ${arrayprod[i][j].id_categ}`;
                    }

                    if (arrayprod[i][j].id_cam_stock == 7)
                    {
                        sqlsentencia = `select  DISTINCT CAMPO7 AS CAMPO from TB_ITEM_STOCK where id_categoria =  ${arrayprod[i][j].id_categ}`;
                    }

                    if (arrayprod[i][j].id_cam_stock == 8)
                    {
                        sqlsentencia = `select  DISTINCT CAMPO8 AS CAMPO from TB_ITEM_STOCK where id_categoria =  ${arrayprod[i][j].id_categ}`;
                    }

                    if (arrayprod[i][j].id_cam_stock == 9)
                    {
                        sqlsentencia = `select DISTINCT CAMPO9 AS CAMPO from TB_ITEM_STOCK where id_categoria =  ${arrayprod[i][j].id_categ}`;
                    }

                    if (arrayprod[i][j].id_cam_stock == 10)
                    {
                        sqlsentencia = `select DISTINCT CAMPO10 AS CAMPO from TB_ITEM_STOCK where id_categoria =  ${arrayprod[i][j].id_categ}`;
                    }

                    let valores = "";

                    promises[`${i}|${j}`] = queryDB(sqlsentencia); //Solo la guardas, no la ejecutas.
                    // Lo guardamos en un objeto, el motivo por el que la clave del objeto es `i|j` 
                    //es para que cuando se resuelvan las promesas, sepas que resultado corresponde a que query
                    console.log("Recupero Query");
                    }
                }
            } //fin de los for
            // Fuera del los for:

            Promise.all(promises)
            .then(result => {
                //result es un objeto con la siguiente estructura --> {'i1|j1' : (resultado), 'i1|j2: (resultado2), ...}
                Object.keys(result).forEach(K => {
                    const [i, j] = K.split('|');

                    const rs = result[K];
                    let valores = '';
                    rs.forEach(function(row) {
                        if (valores = "")
                        {
                            valores = ab2str(row.CAMPO);
                        }
                        else
                        {
                            valores = valores + "_";
                            valores = valores + ab2str(row.CAMPO);
                        }               
                    });
                    valores = '';
                    arrayprod[i][j].valor_combo = valores;
                });
                // Aqui ya deberías tener todas las queries resueltas y podrás resolver tu petición.
                res.json({
                        ok: true,
                        arrayprod
                });
            })
            .catch(result => console.log(result));

        },
        (err) => {
            console.log("error");
        }); // termina el then()
0
ответ дан 02.12.2019, 05:24
  • 1
    Это место исключительное для ответов в вопрос, который ты формулировал. Я предлагаю тебе издавать твой вопрос и добавлять этот результат allí. Так ты можешь удалять этот ответ и избегаешь получать отрицательные точки. Привет – Mauricio Contreras 22.03.2019, 09:38
  • 2
    Совершенный Маурисио большое спасибо из-за совета – Nicolás Ovejero 26.03.2019, 04:18