2

「A」と「B」の2つのテーブルがあります。テーブル「A」の主キーを含むテーブル「B」に行を作成したいのですが、この操作全体はアトミックでなければなりません。

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);
    });
}

ここで、ネストされたプロミスでエラーが発生するたびに、親のプロミスを拒否し、そのエラーを親のプロミスに渡します。

4

2 に答える 2

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 async を使用するのに最適です。

本当に挿入を自動的に生成したい場合は、ヘルパー名前空間を参照してください。サードパーティのライブラリは必要ありません。

于 2016-11-20T12:22:30.297 に答える