Promise.each () не ждите, чтобы обещание решить? - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь сделать много вставок и обновлений, используя одну и ту же транзакцию из NodeJS, используя Knex.js.но я продолжаю получать эту ошибку "Запрос транзакции уже завершен, запустите с DEBUG = knex: tx для получения дополнительной информации".Я позволяю выяснить причину, хотя я обязательно возвращаю обещание от операции.

const { payments, reason } = refund;
const queries = [];

payments.forEach(payment => {
    queries.push(
        knex("variant_snapshots")
        .select("variant_snapshots.payment_id as paymentId")
        .sumDistinct({ PaymentTotal: "variant_snapshots.paid" })
        .sumDistinct({ refunded: "refunds.amount" })
        .leftJoin("refunds", "refunds.payment_id", "variant_snapshots.payment_id")
        .whereExists(function() {
            this.select("*")
            .from("payments")
            .where("id", payment.payment_id);
        })
        .andWhere("variant_snapshots.payment_id", payment.payment_id)
    )
});

if (!payments || payments.length === 0) return false;

knex.transaction(async trx => {
    return Promise.mapSeries(queries, function(payment) {
        return payment()
        .then(function(response){
            let { PaymentId, PaymentTotal, refunded } = response;
            Joi.validate(PaymentId, Joi.number().required());
            let payment = payments.filter(item => item.payment_id === PaymentId);
            Joi.validate(
                payment.amount,
                Joi.number().min(PaymentTotal - refunded || 0)
            );
            return trx("refunds")
            .insert({
                amount: payment.amount,
                payment_id,
                reason
            })
            .then(() => {
                return trx("variant_snapshots")
                .whereIn("id", payment.items)
                .update({ refund_id: id });
            });
        });
    })
    .then(res => {
        console.log("Done!");
        trx.commit();
    })
    .catch(err => {
        trx.rollback();
    });
});

Я ожидал найти данные из базы данных, вставить новые данные и обновить другие строки, а затем вернуть true вконечный пользователь, если все идет хорошо или ложь, если произошла ошибка.

...