Bluebird的bind方法在调用之间保存上下文(此)

时间:2019-05-06 17:50:06

标签: javascript node.js promise bluebird

此文档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 个答案:

答案 0 :(得分:1)

Bluebird Promise.bind被滥用。应该与动态this一起使用:

  

如果没有提供词汇表功能的箭头功能,则在编写面向对象的代码时,异步和同步代码之间的对应关系将崩溃。 .bind可以缓解这种情况。

例如:

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

带有箭头功能的this是词法,它指向节点模块module.exports。在chain个调用之间,它保持不变。