在javascript中使用promises和原型时的优雅回调绑定
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在javascript中使用promises和原型时的优雅回调绑定,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1785字,纯文字阅读大概需要3分钟。
内容图文
![在javascript中使用promises和原型时的优雅回调绑定](/upload/InfoBanner/zyjiaocheng/745/7ace7448a59348368a9a75034d9c3cbc.jpg)
我是一个沉重的JavaScript原型和承诺用户.
我的问题是我需要使用.bind(this)来设置每次我承诺我的承诺时的正确上下文.
以下是显示问题的示例代码(jsbin):
var Q = require('Q');
var AsyncCounter = function(initialValue){
this.value = initialValue;
};
AsyncCounter.prototype.increment=function(){
return Q.fcall(function(){
return ++this.value;
}.bind(this));
};
AsyncCounter.prototype.decrement=function(){
return Q.fcall(function(){
return --this.value;
}.bind(this));
};
var counter = new AsyncCounter(10);
counter.increment()
.then(function(incrementedValue){
console.log('incremented value:', incrementedValue)
})
.then(counter.decrement.bind(counter))
.then(function(decrementedValue){
console.log('decremented value:', decrementedValue)
});
看看我多久需要依赖bind()?我发现它太不优雅了.
我确实知道petkaantonov/bluebird promise库及其非常有用的bind(scope)函数,它在回调中传播范围,但我觉得有一种更好的本地方式来实现它.
有人有正确的方法吗?
解决方法:
还记得当你了解Foo.prototype.bar = function(){…}时,你又回到了构造函数中定义方法,如this.bar = function(){…}?原因是速度和记忆效率.
那么现在你有充分的理由将时钟倒转并牺牲速度/效率以实现“可拆卸”方法 – 即特定于具有此就绪限制的构造函数实例的方法,这正是您想要的.
如果多次调用这些方法,那么在引用函数时不必使用bind()就可以补偿构造的低效率.另外,您可以获得所寻求的语法便利.
这是一个重新编写的示例版本,以更好地演示语法的便利性:
var AsyncCounter = function(value){
this.increment = function(){
return Q.fcall(function(){
return console.log("++value: " + ++value);
}.bind(this));
}.bind(this);
this.decrement = function(){
return Q.fcall(function(){
return console.log("--value: " + --value);
}.bind(this));
}.bind(this);
};
var counter = new AsyncCounter(10);
counter.increment()
.then(counter.decrement)
.then(counter.increment);
总之,您需要做两件事:
>在构造函数中定义方法
>将此绑定到方法.
内容总结
以上是互联网集市为您收集整理的在javascript中使用promises和原型时的优雅回调绑定全部内容,希望文章能够帮你解决在javascript中使用promises和原型时的优雅回调绑定所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。