承诺谁什么都不回报

时间:2017-04-28 09:21:44

标签: sql-server node.js asynchronous promise

我正在尝试使用nodejs的mssql包中的事务类。因此,当我在http://www.dotnetcurry.com/nodejs/1238/connect-sql-server-nodejs-mssql-package上阅读时,我做了以下事情:

Db.prototype.transaction = function() {
  return new Promise((resolve, reject) => {
    pool.connect().then(conn => {
      let transaction = new mssql.Transaction(conn).begin().then(() => {
        new mssql.Request(transaction).query("SELECT * FROM ParkingSlot").then(() => {
          transaction.commit().then((recordset) => {
            conn.close();
            resolve(recordset);
          }).catch(reject)
        }).catch(reject);
      }).catch(reject)
    });
  });
};

在调用者函数上,我做db.transaction().then(console.dir);输出一个控制台的任何结果。但没有任何事情发生。

1 个答案:

答案 0 :(得分:0)

这是因为我在链上使用的mssql的某些函数没有返回任何内容,因此当promise未决时,他将无需任何操作,因为它可以在主调用中的catch链上看到。

其次,对于使用带有事务的nodejs的mssql,连接必须始终是打开的(所以对于我的情况,在构造函数中),我只需要处理事务。

最后,我不必使用新对象创建我的请求或事务。 ConnectionPool :: transaction或ConnectionPool :: Request

可以检索新实例

所以这是最终的代码:

transaction(q) {
    return new Promise((resolve, reject) => {
      let t = connexion.transaction()
      t.begin().then(() => {
        let r = t.request();
        r.query(q).then((recordset) => {
          //console.log(recordset)
          t.commit().then((re) => {
            conn.close();
          }).catch(reject);
          resolve(recordset);
        })
      });
    });
  }

请注意,代码语法不同,因为我传递了ES6类语法,更易读。