此文档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 }
这是正确的行为还是我在某个地方犯了错误?
答案 0 :(得分:1)
Bluebird Promise.bind
被滥用。应该与动态this
一起使用:
如果没有提供词汇表功能的箭头功能,则在编写面向对象的代码时,异步和同步代码之间的对应关系将崩溃。 .bind可以缓解这种情况。
例如:
promise.bind({})
.then(function () {
console.log('this', callNumber, this);
this.t = 1
})
带有箭头功能的this
是词法,它指向节点模块module.exports
。在chain
个调用之间,它保持不变。