我想在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如何实现它。我想要成功:功能在不同的页面上表现不同,所以我需要覆盖,但我不知道如何在这里工作。
答案 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事件,如果没有什么能阻止你的话。