Nodejs: clearInterval () с использованием 'this' - PullRequest
0 голосов
/ 27 апреля 2018

Я хотел очиститьInterval (), и я могу сделать это, используя clearInterval (myInterval), но почему я не могу использовать clearInterval (this)?

Вот код, который работает:

var test =  setInterval(function(){
            request.post({url: myURL, form: {
                user : myUser,
                pass : myPass
                function(err,res,body){
                    if(res.statusCode === 302) clearInterval(test);
                })
        }, 1100)

Вот код, который не работает:

setInterval(function(){
            var that = this;
            request.post({url: myURL, form: {
                user : myUser,
                pass : myPass
                function(err,res,body){
                    if(res.statusCode === 302) clearInterval(that);
                })
        }, 1100)

Редактировать 1: Я прошу прощения за плохой вопрос. Я не очень хорошо знаком с понятием «это» и интуитивно думаю, что используя «это» я могу очиститьInterval (). Причина этого в том, что когда я console.log (test) в первом коде и в console.log (this) во втором коде внутри функции setInterval, вывод был одинаковым, отсюда и интуиция. Что ж, мне лучше изучить «это». Спасибо всем за ваши ответы и комментарии. Очень ценится.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

В вопросе, в функции обратного вызова setInterval «this» означает контекст. В первой функции вы пишете не тот же контекст, что и функция обратного вызова таймера. Контекст имеет значение, поэтому использование clearInterval должно передавать параметр как целое число, а не сам контекст.

0 голосов
/ 27 апреля 2018

setInterval() не предоставляет идентификатор таймера в значении this. Вы просто не можете использовать это таким образом. Идентификатор таймера предоставляется только как возвращаемое значение из setInterval(), как в первом примере.

Вы можете создать свой собственный маленький объект таймера, который инкапсулирует вещи, как вы хотите, сохраняя для вас идентификатор таймера.

Например, вы можете создать свой собственный объект таймера, например, который передает объект таймера в качестве значения this обратному вызову. Тогда вы можете использовать this для вызова clearInterval() метода объекта.

class IntervalTimer() {
    start(cb, t) {
        // if there was a previous interval going here, stop it
        // only one per timer object permitted
        this.stop();
        this.id = setInterval(() => {
            cb.call(this);   // set the this value to be our object
        }, t);
    }
    stop() {
        if (this.id) {
            clearInterval(this.id);
            this.id = null;
        }
    }
}

// usage
let t = new IntervalTimer();
t.start(function() {
   // based on some logic, decide to clear the interval
   // the value of "this" has been set to the timer object
   this.stop();
}, 1000);
...