如何使用Promise(节点,PG)设置多个嵌套查询

时间:2018-07-27 01:17:31

标签: javascript node.js postgresql promise pg

我需要找到一种方法来为包含多个查询的嵌套查询正确设置Promise。这是一个示例:

$courseRecords

我正在使用PG节点模块执行这些查询。

1 个答案:

答案 0 :(得分:0)

由于PG直接支持诺言,因此您可以使用诺言和async/await来做到这一点:

async function getResults() {
    let results = [];
    let table_1_data = await client.query("SELECT table_1_id AS id FROM table_1");
    let table_2_data = await client.query("SELECT table_2_id AS id FROM table_2 WHERE table_1_id = " + table_1_data.rows[0].id);
    for (let table_2_row of table_2_data.rows) {
        let table_3_data = await client.query("SELECT table_3_id AS id FROM table_3_id WHERE table_2_id = " + table_2_row.id);
        for (let table_3_row of table_3_data.rows) {
            let table_4_data = client.query("SELECT table_4_id AS id FROM table_4_id WHERE table_3_id = " + table_3_row.id);
            results.push({
                "table_1_id": table_1_data.rows[0].id,
                "table_2_id": table_2_row.id,
                "table_3_id": table_3_row.id,
                "table_4_id": table_4_data.id
            });
        }
    }
    return results;
}

getResults().then(results => {
    // process results here
    console.log(results);
}).catch(err => {
    // process error here
    console.log(err);
});

请注意,与node.js中的所有异步操作一样,getResults()直到完成都不会阻塞(它立即返回一个Promise),因此您必须在.then()回调中处理结果。


注意:像这样的大量嵌套的多步骤请求意味着可能建议对数据库中的数据进行更好的结构化,或者建议在一个查询中执行多个步骤的查询。

注意:当您的代码(可能是伪代码)将结果推入数组时,它指向table_4_row.id,但是您的代码中没有名为table_4_row的变量。我以为您的意思是table_4_data.id,但您必须将其修复为应该的样子。

注意:此结构假定您要对任何错误中止操作,并且它将拒绝带有该错误的承诺。如果要使用不同的内部错误处理(例如跳过或忽略错误),则必须定义所需的内容。您可以使用awaittry/catch捕获错误,以引入自定义错误处理。