Javascript передает этот и другие параметры для работы - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть приложение узла, в котором есть объект сервера.Этот объект имеет функцию connect ().Предполагается вернуть логическое значение и сохранить соединение в объекте this.Я могу получить либо con, либо 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;

        });

Я хочу сохранить con в this.connection, моя проблема в том, что я не могу получить con и this в функции одновременно.Если вы знаете ссылку, которая может помочь мне понять это, я был бы благодарен.

1 Ответ

0 голосов
/ 10 февраля 2019

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