【问题标题】:How to thow error to parent promise from child promise in pg-promises如何从 pg-promises 中的子承诺向父承诺抛出错误
【发布时间】:2016-11-20 08:12:29
【问题描述】:

我有两个表“A”和“B”。我想在表“B”中创建一行,其中包含表“A”的主键,整个操作应该是原子的。

function test(data, res) {
    let query1 = knex.insert([data], "id").into("A").toString();
    let query2 = "";
    db.tx(function (t) {
        return this.batch([
            t.one(query1).then(function (id) {
                query2 = knex.insert({A_id:id, x:x, y:y}).into("B").toString();
                t.none(query2).catch(function (error) {
                    console.log(error);  // want to pass this error to next catch block
                });
            })
        ]);
    }).then(function () {
        console.log("success");
    }).catch(function (error) {
        console.log(error);
    });
}

每当嵌套承诺出现错误时,我想拒绝父承诺并将该错误传递给父承诺。

【问题讨论】:

  • 除非你在子 catch() 中做任何有建设性的事情,只要删除它,只要你继续返回承诺,父捕获就会触发,但你还需要在 t.one 中返回 t.none
  • @charlietfl 我试过了,但没有工作,出现错误“未处理的承诺拒绝”。
  • 在您的事务中使用t.batch 绝对没有意义。而且pg-promise有自己的,甚至更强大的生成插入和更新的支持,你也不需要使用knex

标签: javascript promise es6-promise knex.js pg-promise


【解决方案1】:

我是pg-promise 的作者。它具有编写非常干净的代码的所有正确成分:

function test(data) {
    db.tx(async t => {
        let b = await t.one('INSERT INTO B(col1, col2) VALUES(${prop1}, ${prop2}) RETURNING id', data);
        await t.none('INSERT INTO A(col1, col2) VALUES($1, $2)', ['bla', b.id]);
    })
        .then(() => {
            console.log('SUCCESS');
        })
        .catch(error => {
            console.log('ERROR:', error);
        });
}

您的示例中根本不需要使用t.batch,它是使用 ES7 异步的最佳选择。

如果你真的想自动生成插入,请参阅helpers 命名空间,不需要第三方库。

【讨论】:

    【解决方案2】:

    得到它的工作....必须返回来自子父级的承诺,即没有 catch() 的 t.none()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 2020-08-29
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多