将一个函数作为参数传递给javascript中的另一个函数
Passing a function as a parameter to be used in another function in javascript
我想在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事件。
- 在构造控制器、服务等时作为函数参数传递之前列出的角度 JS 变量
- 作为函数参数传递的匿名函数的范围
- 通过函数参数传递id
- 将数组值作为函数参数传递
- 是否需要初始化在 Javascript 中作为“类”构造函数参数传递的变量
- JavaScript 函数参数传递数组
- Angular2 将函数参数传递给构造函数
- 为什么我不能将角度变量作为函数参数传递
- jQuery - 基于作为函数参数传递的对象构建动态 if 语句
- 停止对作为函数参数传递到新列表的对象引用
- 在 JavaScript 中将数组作为内置函数参数传递
- AngularJS将范围变量名称作为函数参数传递
- Javascript 将对象作为函数参数传递
- 在对象上调用方法或将对象作为函数参数传递的差异
- 正确的方法:始终将所有变量作为函数参数传递
- 如何将动态创建的复选框值作为函数参数传递
- 节点简斯 |将对象作为函数参数传递
- 什么是将对象属性作为函数参数传递的良好策略/模式
- 将对象作为函数参数传递.不确定如何访问这些值
- 为什么我们要将函数参数传递到$scope$申请