Есть ли способ получить "this.lastID" из обратного вызова sqlite.run (), используя es6 и реагировать на классы - PullRequest
0 голосов
/ 29 января 2019

Я хотел бы получить "последний идентификатор вставки" из обратного вызова функции sqlite.run('INSERT INTO table...', {}, callback).В документах говорится, что можно использовать this.lastID внутри функции обратного вызова.

В моем проекте я использую реагировать и node.js (электрон) с классами es6.Таким образом, моя функция обратного вызова является функцией стрелки, которая (согласно документам из mdn) не получает свой собственный this, она использует this окружающего кода (в данном случае мой класс реагирования):

this.db.run(
    'INSERT INTO table...',
    {},
    (error) => {
        // check error
        if(error !== null) {
            this.props.addNotification({
                open: true,
                variant: 'error',
                message: error.message,
                autoClose: null,
            });
        } else {
            this.props.route.history.push('/...');
            this.props.closeForm();
        }
    }
);

Я попытался перейти к классическому объявлению функции обратного вызова, со следующим результатом:

function(error) {
    ...
    console.log(this.lastID); // is available
    this.props.route.history.push('...'); // cannot access property route of undefined
}

Оба поведения понятны, но есть ли способ получить оба this.lastID из функции обратного вызоваи доступ к this.props или this.state из класса реакции?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вы можете сделать следующее:

// above function
const self= this;
// inside function
function(error) {
  this.lastId;
  self.props.history;
  self.state;
}
0 голосов
/ 29 января 2019

Очевидно, что у вас не может быть двух разных значений this.

Самое простое решение - захватить внешний контекст в замыкании

const component = this

this.db.run(
    'INSERT INTO table...',
    {},
    function (error) {
        console.log(this.lastId) // is available
        // check error
        if(error !== null) {
            component.props.addNotification({
                open: true,
                variant: 'error',
                message: error.message,
                autoClose: null,
            });
        } else {
            component.props.route.history.push('/...');
            component.props.closeForm();
        }
    }
);

или вы можете создать временную переменную.обычная функция, которая будет передавать this.lastId вашему обратному вызову в качестве второго аргумента

this.db.run(
    'INSERT INTO table...',
    {},
    (cb => function(){return cb(error, this.lastId)})((error, lastId) => {
        console.log(lastId) // is available
        // check error
        if(error !== null) {
            this.props.addNotification({
                open: true,
                variant: 'error',
                message: error.message,
                autoClose: null,
            });
        } else {
            this.props.route.history.push('/...');
            this.props.closeForm();
        }
    })
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...