метод связывания из Bluebird сохраняет контекст (это) между вызовами - PullRequest
1 голос
/ 06 мая 2019

После этого документы http://bluebirdjs.com/docs/api/promise.bind.html Я ожидаю, что жизнь связанного контекста закончится с завершением вызова.Но, видимо, это не так.
Следующий код:

const Promise = require('bluebird');

const chain = (callNumber) => {
    console.log('call:', callNumber, '============');
    return asyncFunction()
        .bind({})
        .then(() => {
            console.log('this', callNumber, this);
            this.t = 1
        })
        .then(() => {
            this.t2 = 2
        })
        .then(() => {
            console.log('this', callNumber, this);
        })
};

const asyncFunction = () => new Promise((resolve) => {
    return Promise.delay(100)
        .then(resolve);
});

chain(1).then(() => chain(2));

дает такой результат:

call: 1 ============
this 1 {}
this 1 { t: 1, t2: 2 }
call: 2 ============
this 2 { t: 1, t2: 2 }
this 2 { t: 1, t2: 2 }

Ожидаемый результат:

call: 1 ============
this 1 {}
this 1 { t: 1, t2: 2 }
call: 2 ============
this 2 {}
this 2 { t: 1, t2: 2 }

Это правильное поведениеили я где-то ошибся?

1 Ответ

1 голос
/ 06 мая 2019

Синяя птица Promise.bind используется не по назначению. Предполагается использовать с динамическим this:

Без функций стрелок, обеспечивающих лексическое выражение, соответствие между асинхронным и синхронизирующим кодом нарушается при написании объектно-ориентированного кода. .bind облегчает это.

например:.

promise.bind({})
.then(function () {
    console.log('this', callNumber, this);
    this.t = 1
})

С функциями стрелок, this является лексическим и относится к модулю узла, module.exports. Он остается неизменным между chain звонками.

...