从回调重新运行功能

时间:2018-11-20 13:26:39

标签: node.js postgresql loopbackjs

这是我的伪代码:

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并显示错误:

  

代码:“ 40001”,

     

详细信息:“原因码:在写入过程中被识别为枢轴时被取消。”

     

提示:“如果重试,交易可能会成功。”

因此,如果err中引发了ds.connector.query,我想重新运行ds.connector.query,而不是在Model.observe函数的回调(next)中发回错误

1 个答案:

答案 0 :(得分:0)

不建议使用此方法,因为它可以保持无限循环,但应使用递归方法:

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()
    });
}
相关问题