Javascript 将自定义函数用作其他函数的参数
我目前正在处理代码重构,并尝试按如下方式自动化AJAX请求: 目标是拥有一个独立于上下文的函数来启动AJAX请求。收集的数据根据上下文进行不同的处理 这是我的职责:Javascript 将自定义函数用作其他函数的参数,javascript,jquery,ajax,Javascript,Jquery,Ajax,我目前正在处理代码重构,并尝试按如下方式自动化AJAX请求: 目标是拥有一个独立于上下文的函数来启动AJAX请求。收集的数据根据上下文进行不同的处理 这是我的职责: function ajaxParameter(routeName, method, array, callback){ //Ajax request on silex route var URL = routeName; $.ajax({ type: method, url: URL, beforeSend: fu
function ajaxParameter(routeName, method, array, callback){
//Ajax request on silex route
var URL = routeName;
$.ajax({
type: method,
url: URL,
beforeSend: function(){
DOM.spinner.fadeIn('fast');
},
})
.done(function(response) {
DOM.spinner.fadeOut('fast');
callback(response);
})
.fail(function(error){
var response = [];
response.status = 0;
response.message = "Request failed, error : "+error;
callback(response);
})
}
我的问题本质上是因为我的回调函数没有定义。
我想这样调用函数(示例)
我考虑将响应返回到一个变量,稍后再处理它,但如果请求失败或速度慢,这将不起作用(因为不会设置响应)
该版本将使我受益于.done()
和.fail()
编辑:所以没有错,我稍微修改了我的代码。我们的目标是能够处理
.done()
和.fail()
上下文中使用的回调函数(但在我的情况下,两个单独的函数也可以工作)。传递成功和失败回调是这样的意思吗:
function ajaxParameter(routeName, method, array, success, failure) {
//Ajax request on silex route
var URL = routeName;
$.ajax({
type: method,
url: URL,
beforeSend: function () {
DOM.spinner.fadeIn('fast');
}
}).done(function (response) {
DOM.spinner.fadeOut('fast');
success(response);
}).fail(function (error) {
var response = [];
response.status = 0;
response.message = "Request failed, error : " + error;
failure(response);
})
}
被称为:
ajaxParameter(
URL_base,
'POST',
dataBase,
function(response){
//success function
},
function(response){
// fail function
}
);
据我所知,你的剧本真的没有问题。我在这里稍微整理了一下,但基本上是你以前拥有的:
function ajaxParameter (url, method, data, callback) {
$.ajax({
type: method,
url: url,
data: data,
beforeSend: function(){
DOM.spinner.fadeIn('fast');
}
})
.done( function (response) {
DOM.spinner.fadeOut('fast');
if (callback)
callback(response);
})
.fail( function (error){
var response = [];
response.status = 0;
response.message = "Request failed, error : " + error;
if (callback)
callback(response);
});
}
现在让我们来测试一下
如您所见(使用JSFIDLE AJAX API),它可以正常工作。因此,问题可能与脚本中的其他内容有关。您确定您在此处发布的脚本与您在开发环境中使用的脚本相同吗
关于你的错误;绝对确保以正确的顺序将正确的参数传递给ajaxParameter
函数。以下是我在课堂上要讲的内容:
- url端点(例如)
- 方法(例如“post”)
- 一些数据(例如{foo:'bar'})
- 回调函数(例如函数(响应){};)
.done()
方法那样,在.fail()
方法中使用回调
?您说您的目标是拥有一个“与上下文无关的函数来启动AJAX请求”。这不正是$.ajax
方法的作用吗?我不清楚到底是什么错了,如果您像在示例中那样使用匿名函数调用ajaxParameter函数,它应该可以工作。@shennan这不完全是我的问题,它在.done()中也不起作用,这样做的目的是避免重复请求的代码。@Yoda也应该对此感兴趣,我的控制台告诉我未捕获类型错误:回调不是函数
。您是否尝试过将此特定代码与项目的其余部分隔离并运行它?我相信您会看到它的工作原理与深南提供的js小提琴一样。从那里你可以开始一个消除过程,通过调用堆栈来确定你的bug到底在哪里。这正是我想要做的,不幸的是,当我尝试使用“callback”参数时,我的控制台告诉我这是未捕获的类型错误:callback不是一个函数
非常感谢你的帮助。我使用两个脚本。首先是函数的通用术语表(包括ajaxParameter),然后每个视图都有自己的脚本(按此顺序调用脚本)。该错误显示在函数定义中。该函数在我的脚本中被这样调用:ajaxParameter(URL_base,'POST',数据库,函数(response){console.log(response);},函数(response){console.log(response);})
@PaulGabriel如果不了解调用方法的位置,我不明白为什么会出现未捕获的TypeError
。就我而言,您正在传递一个函数
作为回调
参数。您的代码当前所在的位置是否有实时url?或者你能上传一个例子吗?它可以让你访问,但它是受保护的,所以如果你愿意帮助,我需要私下联系你。更多细节:这是一个Symfony环境,我使用Assetic编译和链接javascript文件。控制台错误甚至在调用函数之前就发生了,声明函数时也会发生。我不确定我们如何私下联系。Stack Overflow chat只允许拥有20个以上声誉的成员,而您目前没有。关于您的第一条评论,您是说在尝试调用ajaxParameter
时发生错误吗?在这种情况下,听起来您可能存在范围问题。您能否确认或取消确认程序(在您调用ajaxParameter
函数时)知道什么是ajaxParameter
?类似这样的console.log(ajaxParameter)
可能吗?实际上,在定义ajaxParameter
时会发生错误(它甚至没有调用它)。如果你有推特,你能在@paulgabriel给我发推特吗?
function ajaxParameter (url, method, data, callback) {
$.ajax({
type: method,
url: url,
data: data,
beforeSend: function(){
DOM.spinner.fadeIn('fast');
}
})
.done( function (response) {
DOM.spinner.fadeOut('fast');
if (callback)
callback(response);
})
.fail( function (error){
var response = [];
response.status = 0;
response.message = "Request failed, error : " + error;
if (callback)
callback(response);
});
}