Javascript将此参数传递给其他函数

时间:2019-02-09 20:37:43

标签: javascript asynchronous this

我有一个具有服务器对象的节点应用程序。该对象具有connect()函数。 Is应该返回一个布尔值并将连接存储在对象的this中。 我可以拿到骗局或这个。

并非未定义的函数示例:

return this.mysql.createConnection({

            host: this.env.host,
            user: this.env.user,
            password: this.env.password,
            database: this.env.database

        }).then( (function(con){

            this.connection = con;
            return con.state === 'authenticated';

        }).apply(this, [con])).catch(function (err) {

            console.log(err);
            return false;

        });

con未被定义的函数示例:

return this.mysql.createConnection({

            host: this.env.host,
            user: this.env.user,
            password: this.env.password,
            database: this.env.database

        }).then(function(con){

            this.connection = con;
            return con.state === 'authenticated';

        }).catch(function (err) {

            console.log(err);
            return false;

        });

我想确保this.connection中的con安全,我的问题是我无法同时获得con和功能中的con。 如果您碰巧知道一个可以帮助我理解这一点的链接,我将不胜感激。

对不起,感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

传递给this的匿名函数中的

.then()是全局范围。您可以使用箭头功能保留this

const o = class {
  constructor() {
    this.n = 0;
  }
  createConnection() {
    // this within arrow function references the curren `class`
    return Promise.resolve(this.state()).then(state => this.n = state + 1).then(state => console.log(this.state()))
  }
  state() {
    return this.n;
  }
}

let x = new o();
x.createConnection();

不确定是什么

.apply(this, [con]))

旨在实现所使用的匿名功能。

另一种方法可能是使用名称定义函数并使用Function.protototype.bind()

function handlePromise(data) {
  console.log(data, this)
}

const o = {abc:123}

Promise.resolve({def:456})
.then(handlePromise.bind(o))