我正在尝试做一些类似以下的事情:
function newCounter(){
return {
"counter" : 0
,"mode" : "new"
,"start" : function( arg_function ){
// Run this before counting.
this.counter = 0;
this.mode = "count";
}
,"finished" : function(){
// Run this when counting is no longer allowed.
this.mode = "done";
}
,"increment" : function(arg_key){
globalThing.isValid(arg_key)
.done(function(data){
if( this.mode === "count" ){
this.counter++;
}
});
}
}
}
现在,正如人们可能会注意到的那样,这里的问题是,在那里的.done()
部分,我有一个this.
的引用 - 它没有也不能引用有问题的对象,因为它是在具有泛型函数的promise中,因此,引用window.
而不是引用的特定对象。我试过这些:
.done(function(data){
if( this.mode === "count" ){
this.counter++;
}
}.apply(this))
.done(function(data){
if( this.mode === "count" ){
this.counter++;
}
}.call(this))
作为解决方案,但他们没有成功。我不完全确定为什么。如果你能看到我在这里想做的事情......你能推荐一个解决我的困境的方法吗?
答案 0 :(得分:2)
改为使用bind
:
.done(function(data){
if( this.mode === "count" ){
this.counter++;
}
}.bind(this))
答案 1 :(得分:0)
在返回对象之前,您始终可以保留对该对象的引用:
function newCounter(){
var o = {
"counter" : 0
,"mode" : "new"
,"start" : function( arg_function ){
// Run this before counting.
o.counter = 0;
o.mode = "count";
}
,"finished" : function(){
// Run this when counting is no longer allowed.
o.mode = "done";
}
,"increment" : function(arg_key){
globalThing.isValid(arg_key)
.done(function(data){
if( o.mode === "count" ){
o.counter++;
}
});
}
}
return o;
}