我在节点中使用babel的require hook来利用ES6,但我在bluebird promise chain中遇到了箭头函数的一些挑战。
我在我的promise链的顶部使用.bind({})
和一个空对象创建共享状态,我可以存储以前的值,直到我需要它们进一步向下链。 Bluebird将此用法解释为" useful side purpose"。
当我切换到箭头功能时,我不能再使用共享状态了,因为箭头功能使用词汇this
,它在babel中是undefined
(babel自动以严格模式运行)。
工作示例:https://jsbin.com/veboco/edit?html,js,console
ES6示例(不工作):https://jsbin.com/menivu/edit?html,js,console
在这种情况下有没有办法利用箭头功能?在我的代码中,我从一个对象方法中调用这些方法 - 不应该将this
定义为调用该方法的对象吗?
答案 0 :(得分:4)
如果您不想要词汇绑定this
,则无需使用箭头功能。如果您想要动态绑定this
,则不要使用箭头功能。
当然,您可以废弃.bind({})
作为一个整体并使用绑定到对象的箭头函数,方法是将所有内容放入对象方法(或示例中的IIFE)中:
(function() {
this; // the value that everything is bound to
double(2).then(result => {
this.double = result; // store result here
return triple(2);
}).then(result => {
console.log('double:', this.double);
console.log('triple:', result);
console.log('sum:', this.double + result);
}).catch(err => {
console.log(err.message);
});
}.call({}));
但是,有much better ways to access previous results in a promise chain而不是contextual state,特别是如果你是using ES6!