gpt4 book ai didi

javascript - 避免黑客正确绑定(bind)到 ES6 中的类?

转载 作者:行者123 更新时间:2023-12-02 15:48:39 26 4
gpt4 key购买 nike

我觉得这相当麻烦。我可能做错了,或者有一些我不知道的更简单的方法(没有找到太多不知道要搜索什么的东西)。

我想避免执行以下两个解决方法,以确保 this 正确指向我的方法内的数据库类:

this.connect = this.connect.bind(this);
db.connect.bind(db)

数据库类:

'use strict';

const http = require('http');
const MongoClient = require('mongodb').MongoClient;

class DB {
constructor(opts){
this.opts = opts;
this.dbUrl = process.env.MONGODB_URL;

// anyway to avoid this hacK?
this.connect = this.connect.bind(this);
this.close = this.close.bind(this)
}

async connect(ctx, next){
try {
ctx.db = await MongoClient.connect(this.dbUrl); // fixes `this` being incorrect here
} catch(err) {
ctx.status = 500;
ctx.body = err.message || http.STATUS_CODES[ctx.status];
}

await next();
}

async close(ctx, next){
const result = await ctx.db.close();
await next();
}
}

module.exports = DB;

调用DB类方法db.connect():

'use strict';

const Koa = require('koa');
const DB = require('./db');
const db = new DB();
const bodyParser = require('koa-bodyparser');
const router = require('koa-router');

const api = router();
const app = new Koa();
const cors = require('kcors');

app
.use(bodyParser())
.use(cors())
.use(db.connect); // the above constructor copying fixes having to do `db.connect.bind(db)` here

// without the constructor fix in class DB:

.use(db.connect.bind(db)) // this gets annoying having to do this everywhere

哪个更“正确”,或者是否有第三种方法可以避免这两种解决方法?如果这是将类方法绑定(bind)到其类的唯一两种方法,那么每种方法的优缺点是什么。

最佳答案

有一系列有用的自动绑定(bind)功能。我今天写了一篇来改进它们。看看:https://www.npmjs.com/package/auto-bind-inheritance

npm install --save 自动绑定(bind)继承

const autoBind = require('自动绑定(bind)继承');

只需将 autoBind(this); 放入子类构造函数中,所有方法和方法指针都将绑定(bind)到该对象,就像您在 C++/Java 中所期望的那样。这基本上会为您调用bind

因此,如果您在使用方法作为绑定(bind)到另一个“this”的回调时遇到问题,此包将修复它。

关于javascript - 避免黑客正确绑定(bind)到 ES6 中的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41338805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com