初始化类以访问方法

时间:2019-06-14 19:28:52

标签: javascript node.js

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

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

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})
    }
    })

2 个答案:

答案 0 :(得分:1)

我不确定您了解什么类和实例化。如果您拥有所有此类共享的相同方法,并且不存储数据,则可以仅对它使用静态方法,而无需实例化。如果它正在存储数据,但该数据在各处共享,则可以只使用一个全局实例(所有实例都使用该实例)(“单例模式”)。如果您需要该类的多个版本,每个版本具有不同的数据,那就是您实例化该类的多个实例。

答案 1 :(得分:0)

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

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

如果对象中没有实际状态,则应该将这些方法设为静态方法,您可以随时调用它们而无需创建新实例。

如果我们能看到并理解您的实际代码,我们将为您提供更多帮助。