【问题标题】:Initializing a Class to access Methods初始化一个类以访问方法
【发布时间】:2019-06-14 19:28:52
【问题描述】:

我想知道最好的方法是初始化一个类的新实例以访问我的类中的方法。 My Class 建立数据连接,然后有一些方法来获取数据。 在我的控制器中,我有多个使用该类的功能。所以我的问题是可以为每个控制器初始化一次类,还是我需要为每个函数甚至每次调用方法都执行此操作,因为某些函数可能会多次调用多个方法或同一个方法。目前我为每个函数初始化一次类,但要确保我以正确的方式继续前进。

为了澄清一点,我的班级看起来像这样

const couchbase = require("couchbase")
var config = require('../config/config')

 class CouchController {
    constructor() {
        this.cluster = new couchbase.Cluster(config.cluster);
        this.cluster.authenticate(config.userid, config.password)
        this.N1qlQuery = couchbase.N1qlQuery;

        this.bucket = this.cluster.openBucket('Contacts', function(err) {
        if (err) {
        console.error('Got error: %j', err);
        }
    });
        this.bucket2 = this.cluster.openBucket('mail_store', function(err) {
        if (err) {
        console.error('Got error: %j', err);
        }
    });

      }

      bucketWithName(name) {
        let buckets = { "mail": this.bucket2, "contacts": this.bucket}
        return buckets[name] || this.bucket // this.bucket is default
    }
               n1qlQuery_wId(bucketName,n1qlStr, id){

            let bucket = this.bucketWithName(bucketName)
            return new Promise((resolve,reject)=>{
                let statement = this.N1qlQuery.fromString(n1qlStr)
                statement.consistency(this.N1qlQuery.Consistency.REQUEST_PLUS)
                bucket.query(statement, id, (err, result, meta)=>{

                if(err){
                    console.log(err)
                    return reject(err)
                } 
                return resolve([result, meta])

                })
            })
            }

在我的控制器中,我现在这样称呼它

farmRoutes.get('/list', async(req, res) => {
    try {

    var couchdb = new couch
    var myQuery = await cbQ.farmGrid(req.query, true)
    var myCount = await couchdb.n1qlQuery_wId("contacts",myQuery[0],[])
    var result = await couchdb.n1qlQuery_wId("contacts",myQuery[1],[] )

    res.status(200).json({ Success: true , Error: "", Message: "", "RowsAffected" : result[1].metrics.resultCount, "RowCount" : myCount[0][0].count,  Data: result[0]})

    } catch (error) {

        console.log(error)
        res.status(200).json({ Success: false , Error: error.code , Message: error.message})
    }
    })

【问题讨论】:

  • 您使用的是什么技术?根据你使用它可以完成。我有一些 Vuejs 代码,我将它们组合成一个可以通过应用程序使用的 mixin。

标签: javascript node.js


【解决方案1】:

我不确定您是否了解类和实例化的用途。如果你让所有东西都共享这个类的相同方法,并且它不存储数据,那么你可以只使用静态方法而不实例化它。如果它正在存储数据,但该数据在任何地方都共享,那么您可以只拥有一个所有东西都使用的全局实例(“单例模式”)。如果您需要该类的多个版本,每个版本具有不同的数据,那就是您实例化该类的多个实例的时候。

【讨论】:

    【解决方案2】:

    存在具有方法的对象,以便它们可以将状态存储在对象中。因此,您应该创建对象的一个​​实例,并在需要它的状态时保留它。

    如果您正在讨论的对象没有持久状态,那么通常没有理由保留它,您会在需要时创建一个,然后在完成时释放它。

    如果对象中没有实际状态,那么这些方法可能应该被制成静态方法,您可以随时调用而无需创建新实例。

    如果我们能够看到并理解您的实际代码,我们可以为您提供更具体的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      相关资源
      最近更新 更多