【问题标题】:Querying from a self made database class从自制的数据库类中查询
【发布时间】:2013-07-04 23:19:18
【问题描述】:

感谢您的关注,我被困在代码中,我不是一个真正出色的 javascript 开发人员,我在创建数据库类时遇到了困难,我的问题是我尝试使用和封装 postgre 的方法的范围类内的连接:

Connector = new require('./connector.js').Connector
PGClient = new require('pg').Client

exports.Database =
  class Database
    constructor:(@connector)->
      @connector = Connector if not @connector
      @client = new PGClient( @connector.connection_string );
      @client.connect()

    close: ->
      @client.end()

    query: (sql) ->
      @client.connect (err) ->
        @client.query 'SELECT NOW() AS "theTime"', (err, result) ->
            return result.rows[0].theTime
            #output: Tue Jan 15 2013 19:12:47 GMT-600 (CST)

在查询方法中我建立了一个连接,然后在连接回调中我想使用使用@client对象的查询,我想在返回语句之前调用close方法,但是这样,在回调中我无权访问对象范围。

有没有办法做到这一点?

javascript中的代码

(function() {
  var Connector, Database, PGClient;

  Connector = new require('./connector.js').Connector;

  PGClient = new require('pg').Client;

  exports.Database = Database = (function() {
    function Database(connector) {
      this.connector = connector;
      if (!this.connector) {
        this.connector = Connector;
      }
      this.client = new PGClient(this.connector.connection_string);
      console.log(this.client);
      this.client.connect();
    }

    Database.prototype.close = function() {
      return this.client.end();
    };

    Database.prototype.query = function(sql) {
      return this.client.connect(function(err) {
        return this.client.query('SELECT NOW() AS "theTime"', function(err, result) {
          return result.rows[0].theTime;
        });
      });
    };

    return Database;

  })();

}).call(this);

【问题讨论】:

  • 这在我看来不太像 Javascript。
  • 它的咖啡脚本,但问题与javascript有关,我将发布javascript代码

标签: javascript coffeescript scope anonymous-function


【解决方案1】:

与任何事情一样,您需要在致电@client.connect() 之前制作一份副本:

query: (sql) ->
  client = @client
  @client.connect (err) ->
    @client.query 'SELECT NOW() AS "theTime"', (err, result) ->
        client.close()
        return result.rows[0].theTime

在 JavaScript 中:

Database.prototype.query = function(sql) {
    var client = this.client;

    return this.client.connect(function(err) {
      return this.client.query('SELECT NOW() AS "theTime"', function(err, result) {
        client.close();
        return result.rows[0].theTime;
      });
    });
};

【讨论】:

    【解决方案2】:

    尝试使用范围解析操作符调用原型方法:Database::close();

    等效的 CoffeeScript 是:

    Connector = new require('./connector.js').Connector
    PGClient = new require('pg').Client
    
    exports.Database =
      class Database
        constructor:(@connector)->
          @connector = Connector if not @connector
          @client = new PGClient( @connector.connection_string );
          @client.connect()
    
        close: ->
          @client.end()
    
        query: (sql) ->
          @client.connect (err) ->
            @client.query 'SELECT NOW() AS "theTime"', (err, result) ->
              Database::close()
              result.rows[0].theTime
    

    【讨论】:

    • 现在你已经把它变成了一个单例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    相关资源
    最近更新 更多