我该怎么做使用promises和泛型函数

时间:2015-09-24 18:04:50

标签: javascript ajax promise this

我正在尝试做一些类似以下的事情:

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))

作为解决方案,但他们没有成功。我不完全确定为什么。如果你能看到我在这里想做的事情......你能推荐一个解决我的困境的方法吗?

2 个答案:

答案 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;
}