【发布时间】:2016-04-16 13:59:58
【问题描述】:
因为我使用的原型具有调用同一原型中其他函数的函数,所以我必须使用 this 引用该方法
问题this创建:
但正因为如此,我必须保留一个使用 this 的上下文,这让我形成了非常丑陋的 .bind(this) 墙。
这是我为笑而制作的简化示例。
Killmyself.prototype.fireLeMissles = function () {
return new Promise(function(resolve,reject) {
this.anotherFunction(param).then(function(result) {
someList.forEach(function(item) {
this.fireLeMissles().then(function(anotherResult){
promiseList.push(anotherResult)
})
},this);
Promise.all(promiseList).then(function(promiseItem){
childPlacesIds.forEach(function(childPlaceId) {
//Do Other Stuff
},this);
});
resolve(result);
}.bind(this).catch(function(err){
console.log("Yea, life sucks sometimes.")
}));
}.bind(this));
}
Killmyself.prototype.another = function(){
//Other stuff
}
您可以看到,因为调用了同一原型中的函数,例如 this.anotherFunction(... 和 this.fireLeMissles(... 我必须深度保存上下文,现在(在我的更大版本中)使这段代码难以使用。
问题:
这是一个“习惯于 JavaScript 更难的方面”的事情吗?还是经验丰富的开发人员看到了可以避免像这样的深度绑定的简单方法?
【问题讨论】:
-
如果
nesting高一级,我将使用.bnd(this),否则将使用var _this=this并在嵌套函数中引用_this.. -
既然你用 ES6 标记了这个,你熟悉箭头函数吗?
-
@loganfsmyth 我一直尝试坚持使用 es5,因为我从未想过将 babel 与服务器端编码一起使用,但我相信箭头函数的好处之一是上下文是隐含的。
-
很高兴澄清一下,既然您标记了 ES6,我假设您要求的是 ES6 解决方案。 Node 4 和 5 原生支持箭头函数和 Promise,所以很多人使用它们。
-
@loganfsmyth 对不起,我也忘了标记 es5。我只是假设我将自己归类为一个糟糕的设计,或者为了这些目的而存在一个更巧妙的 es6 解决方案(我还没有深入研究)。
标签: javascript promise ecmascript-6 es6-promise