【问题标题】:Query inside foreach Node.js Promis在 foreach Node.js Promise 中查询
【发布时间】:2018-10-01 00:59:22
【问题描述】:

我按承诺将查询放在里面。我正在尝试查询 mysql 数据库两次,第二次,从第一次开始多次查询每个结果,但我无法弄清楚如何在继续之前等待第二次查询的结果

我想要这样的输出:

{
   "data":[
      {
         "name":"Title result",
         "images":[
            {
               "id":1,
               "place_id":705,
               "path_image":"http://3.bp.blogspot.com/-iwF-ImFpzvk/T6fKhC6F7YI/AAAAAAAAARA/FyKpNcDsP8M/s1600/asd2e1.jpg"

            },
            {
               "id":2,
               "place_id":705,
               "path_image":"https://asrt.bp.com/data/photo/2014/07/22/sddrfr2.jpg",
            }
         ]
      }
   ]
}

但我得到的只是这样:

{
   "data":[
      {
         "name":"Title result",
         "images":[]
}

这是我的代码:

return new Promise((resolve, reject) => {
                const { connection, errorHandler } = deps;
                let arrayData = [];
                let imageData = [];

                connection.query(
                    "SELECT * FROM places WHERE id = 705",
                    (error, rows, results) => {
                        rows.forEach((row) => {
                            connection.query(
                                "SELECT * FROM place_gallery WHERE place_id = 705",
                                (error, rows, results) => {
                                    imageData = rows;

                                }
                            )
                            arrayData.push({ name: row.title, images: imageData })


                        });

                        if (error) {
                            errorHandler(error, "failed", reject);
                            return false;
                        }
                        resolve({ data: arrayData });

                    }
                );

            })
        },

如何解决?

【问题讨论】:

    标签: mysql node.js promise


    【解决方案1】:

    试试这个,另一种创建 dbcall 函数的方法,您可以使用 util.promisify() 将查询回调转换为 Promise

    const dbcall = (query) => {
        return new Promise((resolve, reject) => {
            connection.query(
                query,
                (error, rows, results) => {
                    if (error) return reject(error);
                    return resolve(rows);
                });
        });
    };
    
    const somefunc = async () => {
        const {
            connection,
            errorHandler
        } = deps;
        let arrayData = [];
        try {
            const rows = await dbcall("SELECT * FROM places WHERE id = 705");
            rows.forEach(async (row) => {
                const imageData = await dbcall("SELECT * FROM place_gallery WHERE place_id = 705");
                arrayData.push({
                    name: row.title,
                    images: imageData
                });
            });
        } catch (error) {
            console.log(error);
        }
        return arrayData;
    }
    

    【讨论】:

    • 嗨,感谢您的回复,我尝试上面的代码是错误的 const imageData = await dbcall("SELECT * FROM place_gallery WHERE place_id = 705");因为 await 只在 async 函数中有效
    • 嗨,谢谢,arrayData 仍然为 0,我尝试记录进程的执行方式 try { rows.forEach(async (row) => { const imageData = await dbcall("...") ; arrayData.push({ ... }); console.log("forEach " + arrayData.length)}); console.log("on try "+arrayData.length) } catch (error) { console.log(error); } console.log("outside try"+ arrayData.length) 结果是在 try0 之外的 try0 forEach 1 。返回 arrayData 不等待每个进程
    猜你喜欢
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多