Перезапустить функцию из обратного вызова - PullRequest
0 голосов
/ 20 ноября 2018

Вот мой псевдокод:

Model.observe('after save', function (ctx, next) {
  const sql = `
    BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    -- ...
    COMMIT;
  `
  ds.connector.query(sql, function (err, res) {
    if (err) {console.log(err); return next(err)}
    next()
  })
}

Я пытаюсь запустить необработанный SQL-оператор, но db (postgres) возвращает s с ошибкой:

code: '40001' ,

1008 * деталь: 'код причины: Отменено по идентификации в качестве опоры, во время записи',
1010 * подсказка: '. сделка может добиться успеха, если повторен',
1012*

, поэтому, если err поднято в ds.connector.query, я хочу перезапустить ds.connector.query вместо отправки ошибки в Model.observe обратном вызове функции (next)

1 Ответ

0 голосов
/ 20 ноября 2018

Не рекомендуется, поскольку он может оставаться в бесконечном цикле, но он должен работать с использованием рекурсии:

let failCount = 0, maxTry = 3;

Model.observe('after save', function (ctx, next) {
  const sql = `
    BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    -- ...
    COMMIT;
  `
  query(sql, next);
}

function query(sql, next) {
    ds.connector.query(sql, function (err, res) {
        if (err) {
            console.log(err);
            if (failCount < maxTry) {
                query(sql, next); //querying again
                failCount++;
            } else {
                next(err);
            }
        }
        next()
    });
}
...