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

Passing a function as a parameter to be used in another function in javascript

本文关键字:函数 参数传递 javascript 另一个 一个      更新时间:2023-09-26

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

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()创建;),然而,我知道如何实现它。我希望成功:函数在不同的页面上表现不同,所以我需要一个覆盖,但我不确定如何在这里实现它。

尝试更改

success: function(rData){
   return rData;
}

success: success

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

        success: function(rData){
            return rData;
        }

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

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

或者,为了缩短它,将回调函数作为参数直接传递到jQueryajax中。

您没有在任何地方使用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) {允许您的成功参数是可选的;如果没有传递,它将使用您指定的默认处理程序。

您正在进行异步调用,并且您的行为就像是同步的。您不能从异步调用返回并期望它将数据返回到被调用的位置。

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

考虑这一点的方法是,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事件。