我正在尝试为链式方法编写Wrapper:
new Example().child("First").child("Second").read(function(name){console.log(name)})
包装器应该保存第一次执行的结果。下次使用相同的方法调用包装器时,它不应该执行原始方法,它应该返回保存的结果< / b>:
wrapper = new Wrapper();
//this time the result of the passed method gets saved
wrapper.wrap(new Example().child("First").child("Second").read, function(name){console.log(name)})
//now it should return the saved value
wrapper.wrap(new Example().child("First").child("Second").read, function(name){console.log(name)})
我想为数据库lib的调用实现此功能。当设备没有互联网连接时,它应该从保存的包装状态读取。
我实现了这样的包装器:
Wrapper = function () {
this.saved_funcs = {}
}
Wrapper.prototype.wrap = function (func, callbac) {
if (func in this.saved_funcs) {
callbac(this.saved_funcs[func]);
} else {
func(function (result) {
this.saved_funcs[func] = result;
callbac(result);
}.bind(this))
}
};
http://jsfiddle.net/boaLf6s3/1/
但是当我执行包装器时它返回undefined?我的示例将始终存储整个代码以检查方法是否已被触发。 这就是为什么我想问你如何实现这样的包装?谢谢
答案 0 :(得分:1)
您尝试引用的函数需要从对象的上下文中执行,因为它使用<i class="fa fa-check"></i>
。如果您只是传递对象并改为呼叫this
,那就更好了。
read
&#13;
Example = function(){
this.text = "";
}
Example.prototype.child = function(name){
this.text += name + " " + name;
return this;
}
Example.prototype.read = function(callbac){
callbac(this.text);
}
Wrapper = function(){
this.saved_funcs = {}
}
Wrapper.prototype.wrap = function(obj, callbac){
if(obj.read in this.saved_funcs){
callbac(this.saved_funcs[obj.read]);
}else{
obj.read(function(result){
this.saved_funcs[obj.read] = result;
callbac(result);
}.bind(this))
}
};
new Example().child("First").child("Second").read(function(name){document.getElementById("normal").innerHTML = name})
wrapper = new Wrapper();
wrapper.wrap(new Example().child("First").child("Second"), function(name){console.log(name)})
wrapper.wrap(new Example().child("First").child("Second"), function(name){ document.getElementById("saved").innerHTML = name })
&#13;
或者你可以像这样绑定你的函数:
<h2>
Normal Result
</h2>
<p id="normal">
</p>
<h2>
Saved Result
</h2>
<p id="saved">
</p>
&#13;
Example = function(){
this.text = "";
}
Example.prototype.child = function(name){
this.text += name + " " + name;
return this;
}
Example.prototype.read = function(callbac){
callbac(this.text);
}
Wrapper = function(){
this.saved_funcs = {}
}
Wrapper.prototype.wrap = function(func, callbac){
if(func in this.saved_funcs){
callbac(this.saved_funcs[func]);
}else{
func(function(result){
this.saved_funcs[func] = result;
callbac(result);
}.bind(this))
}
};
new Example().child("First").child("Second").read(function(name){document.getElementById("normal").innerHTML = name})
wrapper = new Wrapper();
var child = new Example().child('First').child('Second');
var read = child.read.bind(child);
wrapper.wrap(read, function(name){console.log(name)})
wrapper.wrap(read, function(name){ document.getElementById("saved").innerHTML = name })
&#13;