将函数作为参数传递给javascript中的另一个函数

时间:2012-08-30 13:20:15

标签: javascript jquery closures

我想在javascript中创建一个API系统(在单个对象中),所有这些都源于jQuery的ajax函数,但我希望能够通过覆盖“成功”函数来触发,如下所示: / p>

function Eidos(){

    this.api = function(data, success){
        $.ajax({
            type: 'POST', 
            url: '/api',
            data: data,
            success: function(rData){
                return rData;
            }
        })
    };

    this.refreshInfo = function(id, success){
            log.info('refreshed page id:  '+ id);
            return this.api({'command': 'refresh', 'pageid': id}, success);
    }


};

在这个例子中,我只想“刷新”信息(提取新的文本数据或者你有什么)。我已经有一个服务器端页面设置。

我会这样称呼它:

$('.refresh').click(function(){
        $("#myModal").modal('show');
        var id = $(this).data('ei');
        var api = eidos.refreshInfo(id, function(){
                $("#myModal").modal('hide');
                });
        return false;
    });

显然这不起作用(顺便说一句,该对象已经通过var eidos = new Eidos();)创建,但是,Idk如何实现它。我想要成功:功能在不同的页面上表现不同,所以我需要覆盖,但我不知道如何在这里工作。

5 个答案:

答案 0 :(得分:4)

尝试更改

success: function(rData){
   return rData;
}

success: success

您目前没有调用(甚至不使用)success参数。

答案 1 :(得分:2)

        success: function(rData){
            return rData;
        }

是问题所在。您已经有一个回调函数的参数,所以请使用它:

        success: function(rData) {
            success(rData);
        }

或者,为了缩短它,将回调函数直接传递给jQuery ajax作为参数。

答案 2 :(得分:1)

您正在进行异步调用,并且您表现得像是同步的。您无法从异步调用返回,并希望它将数据返回到调用它的位置。

this.api = function(data, success){
    $.ajax({
        type: 'POST', 
        url: '/api',
        data: data,
        success: function(rData){
            return rData;  //<-- That return is not going to work
        }
    })
};

如果你想传递一个回调,而不是分配它。

this.api = function(data, success){
    $.ajax({
        type: 'POST', 
        url: '/api',
        data: data,
        success: success
        }
    })
};

或称之为

this.api = function(data, success){
    var that = this;
    $.ajax({
        type: 'POST', 
        url: '/api',
        data: data,
        success: function(rData){
            success(); //<-- call it or you can use apply/call
            //success.apply(that,arguments);
            return rData;  //<-- That return is not going to work
        }
    })
};

答案 3 :(得分:1)

您没有在任何地方使用success回调。

this.api = function(data, success){
    $.ajax({
        type: 'POST', 
        url: '/api',
        data: data,
        success: success || function(rData) {
            // some default handler to use if none is passed
        }
    })
};

success: success || function(rData) {允许您的成功参数是可选的;如果没有传递,它将使用您指定的默认处理程序。

答案 4 :(得分:0)

想到这一点的方法是JQuery ajax函数在触发它时将rData传递给你的函数。 rData只是在jQuery内部的一个封闭范围内的某个地方返回,你没有任何控制权,所以在这个成功函数里面做一些事情。

或者你可以通过另一个事件向外界发出信号:

//...
    success:function(rData){
        $(someOtherObject).trigger({type:'rDataDelievered', successData:rData});
    }
}

someOtherObject.bind('rDataDelivered', function(e){ doSomething(e.successData); });

这不是一个使用频繁的功能,但是,您可以动态定义一个新事件,并使用jQuery在您想要的任何内容上触发它。如果您没有传递rData对象,trigger('rDataDelivered')就足以获得简单的信号。但这里有一些冗余。最好在成功函数中执行此操作,并在适当的情况下建立ajax事件,如果没有什么能阻止你的话。