Jquery AJAX全局变量
我正在尝试这样做,它返回“未定义”:Jquery AJAX全局变量,jquery,global-variables,Jquery,Global Variables,我正在尝试这样做,它返回“未定义”: $.ajax({ url : 'curriculum/read_types', type : 'GET', dataType : 'JSON', success : function(data) { return data; } }) 但如果我这样做: $.ajax({ url : 'curriculum/read_types', type : 'GET', dataType
$.ajax({
url : 'curriculum/read_types',
type : 'GET',
dataType : 'JSON',
success : function(data) {
return data;
}
})
但如果我这样做:
$.ajax({
url : 'curriculum/read_types',
type : 'GET',
dataType : 'JSON',
success : function(data) {
console.log(data);
}
})
它在控制台上写入整个JSON对象,因此我知道存在数据
如何返回此数据
我想做的是下一步:
var curriculum = {
add : function() {
html = [];
html.push('<select name="type" required>');
html.push('<option value="0">Grupo general...</option>');
var types = curriculum.read_types();
$.each(types, function(k,v) {
html.push('<option value="'+v+'">'+v+'</option>')
})
html.push('</select>');
content.show('Añadir imagen a curriculum',html.join(''));
},
read_types : function() {
$.getJSON('curriculum/read_types', function(data) {
return data;
})
}
}
curriculun.add()
最后,它通过一个asyn:false请求进行了管理:
var curriculum = {
add : function() {
html = [];
html.push('<select name="type" required>');
html.push('<option value="0">Grupo general...</option>');
var types = curriculum.read_types();
$.each(types, function(k,v) {
html.push('<option value="'+v+'">'+v+'</option>')
})
html.push('</select>')
content.show('Añadir imagen a curriculum',html.join(''));
},
read_types : function() {
var a;
$.ajax({
url : 'curriculum/read_types',
type : 'GET',
async : false,
contentType : 'JSON',
success : function(data) {
a = data;
}
})
return a;
}
}
如前所述,ajax是异步的。您可以传递async false以强制javascript线程等待,但这很讨厌,而且与javascript非常不相似。 我认为这是你想要的:
var myData;
$.ajax({
url : 'curriculum/read_types',
type : 'GET',
async : false,
dataType : 'JSON',
success : function(data) {
myData = data;
}
})
// while this is what you want to do, myData would be undefined here
console.log(myData);
但是你应该继续做你在success函数中所做的事情。如前所述,ajax是异步的。您可以传递async false以强制javascript线程等待,但这很讨厌,而且与javascript非常不相似。 我认为这是你想要的:
var myData;
$.ajax({
url : 'curriculum/read_types',
type : 'GET',
async : false,
dataType : 'JSON',
success : function(data) {
myData = data;
}
})
// while this is what you want to do, myData would be undefined here
console.log(myData);
但是,您应该继续执行success函数中的操作。回调函数(如success处理程序)是注册的异步事件,在AJAX请求完成后触发,并将成功结果返回到客户端浏览器。由于事件已注册,因此它不会阻止AJAX请求所在的函数运行 为了处理数据,只需将数据传递给另一个函数,如下所示:
$.ajax({
url : 'curriculum/read_types',
type : 'GET',
dataType : 'JSON',
success : function(data) {
console.log(data):
// process the results
processData(data);
}
});
function processData(data) {
// do stuff with the data here
}
更新:
上面的代码是您无法执行的。以下是对流程的松散描述:
read_types函数是从其他进程调用的
使用两个参数调用$.getJSON函数:路径和回调处理程序
read_types函数完成处理并到达末尾
接下来,在read_types方法完成的过程中,getJSON函数向您的URL发出httpget请求。
数据在响应中接收,并作为分配给参数数据的参数传递给回调处理程序。
调用返回数据时;您正在将数据返回到匿名成功回调函数,而不是读取类型。因此,return语句基本上什么也不做。
同步请求示例:
现在,尽管如此,您可以向服务器发出同步请求,但由于它对视图的影响,强烈反对这样做
然而,这里有一个例子,仅用于学术目的。除非你真的知道自己在做什么,否则我不会提倡使用这种策略:
注意:除非您知道自己在做什么,否则不得在生产中使用
回调函数(如成功处理程序)是注册的异步事件,在AJAX请求完成后触发,并将成功结果返回给客户端浏览器。由于事件已注册,因此它不会阻止AJAX请求所在的函数运行 为了处理数据,只需将数据传递给另一个函数,如下所示:
$.ajax({
url : 'curriculum/read_types',
type : 'GET',
dataType : 'JSON',
success : function(data) {
console.log(data):
// process the results
processData(data);
}
});
function processData(data) {
// do stuff with the data here
}
更新:
上面的代码是您无法执行的。以下是对流程的松散描述:
read_types函数是从其他进程调用的
使用两个参数调用$.getJSON函数:路径和回调处理程序
read_types函数完成处理并到达末尾
接下来,在read_types方法完成的过程中,getJSON函数向您的URL发出httpget请求。
数据在响应中接收,并作为分配给参数数据的参数传递给回调处理程序。
调用返回数据时;您正在将数据返回到匿名成功回调函数,而不是读取类型。因此,return语句基本上什么也不做。
同步请求示例:
现在,尽管如此,您可以向服务器发出同步请求,但由于它对视图的影响,强烈反对这样做
然而,这里有一个例子,仅用于学术目的。除非你真的知道自己在做什么,否则我不会提倡使用这种策略:
注意:除非您知道自己在做什么,否则不得在生产中使用
Ajax是异步的,所以返回它没有什么好处。您可以改为使用自定义事件。在成功功能中:
$('#someelement').trigger('read_types_loaded', [data]);
然后将事件侦听器附加到某个位置:
$('#someelement').bind('read_types_loaded', function(event,data){
// Do something with data
});
Ajax是异步的,所以返回它没有什么好处。您可以改为使用自定义事件。在成功功能中:
$('#someelement').trigger('read_types_loaded', [data]);
然后将事件侦听器附加到某个位置:
$('#someelement').bind('read_types_loaded', function(event,data){
// Do something with data
});
success是一个回调函数,您不能从中返回。您可以在success中使用JSON对象。将数据返回给什么?通常,在进行ajax调用之前声明一个变量,如果需要访问它,则将数据分配给成功处理程序中的变量?它应该是返回数据;您必须执行同步AJAX调用才能执行类似的操作,但我不推荐这样做。正如其他人提到的,您不会从回调返回数据。相反,你可以用它做点什么。所以你要修改它
e DOM、更新“model”对象等。success是一个回调函数,不能从中返回。您可以在success中使用JSON对象。将数据返回给什么?通常,在进行ajax调用之前声明一个变量,如果需要访问它,则将数据分配给成功处理程序中的变量?它应该是返回数据;您必须执行同步AJAX调用才能执行类似的操作,但我不推荐这样做。正如其他人提到的,您不会从回调返回数据。相反,你可以用它做点什么。因此,您可以修改DOM,更新“model”对象,等等。Marcus,虽然我很清楚您在说什么,但您应该强调,您发布的代码将导致在console语句中抛出null或未定义的错误。其他人可能没有仔细阅读,可能只是查看代码。除此之外,在成功处理程序中处理数据确实是一个可行的选择,这是正确的。祝你好运您要找的是ifwindow.console,还是我误解的异步参数?很抱歉,您的答案是正确的,只是其他人可能会忽略关于继续您正在做的事情的部分,他们可能只是查看代码部分,对自己说。“console.log”中未定义myData,因为它在成功回调将数据分配给myData之前启动。换句话说,我不想让你在一个正确答案上被否决,而这个答案可能会被夜以继日的人忽略:希望这会有所帮助。我在console.log上面添加了一条代码注释。如果我误解了您的意思,或者您认为这没有抓住您答案的重点,请随时回滚我的编辑:但是我想在成功函数回调中做的是不可能的,我已经在第一条注释中添加了整个代码。谢谢Marcus,虽然我很清楚您在说什么,但您应该强调,您发布的代码将导致在console语句中抛出null或未定义的错误。其他人可能没有仔细阅读,可能只是查看代码。除此之外,在成功处理程序中处理数据确实是一个可行的选择,这是正确的。祝你好运您要找的是ifwindow.console,还是我误解的异步参数?很抱歉,您的答案是正确的,只是其他人可能会忽略关于继续您正在做的事情的部分,他们可能只是查看代码部分,对自己说。“console.log”中未定义myData,因为它在成功回调将数据分配给myData之前启动。换句话说,我不想让你在一个正确答案上被否决,而这个答案可能会被夜以继日的人忽略:希望这会有所帮助。我在console.log上面添加了一条代码注释。如果我误解了您的意思,或者您认为这没有抓住您答案的重点,请随时回滚我的编辑:但是我想在成功函数回调中做的是不可能的,我已经在第一条注释中添加了整个代码。谢谢你的创意!我得记住扳机!但是,如果只调用成功处理程序中的函数并以这种方式传递数据,而不是将某个对象绑定到某个任意的DOM元素,不是更容易吗。一般来说,我只喜欢在处理异步函数时使用事件,以确保调用函数时数据准备就绪。当您突然连续调用了两个异步函数时,调试会变得更容易,而且事情变得很有趣。你应该考虑用一个例子来详细说明你的答案。我不是100%肯定我理解,但我有兴趣了解更多。例如,成功回调处理程序是否也会等到数据准备就绪后再尝试使用数据?我不是100%肯定我看到了后一种方法的优势,因为后者似乎更常见,但仍然可能达到相同的目标。当然,我会看看明天我是否能带来一些东西!我现在在一台iPad上,所以像上面这样写一个答案需要30分钟。很有创意!我得记住扳机!但是,如果只调用成功处理程序中的函数并以这种方式传递数据,而不是将某个对象绑定到某个任意的DOM元素,不是更容易吗。一般来说,我只喜欢在处理异步函数时使用事件,以确保调用函数时数据准备就绪。当您突然连续调用了两个异步函数时,调试会变得更容易,而且事情变得很有趣。你应该考虑用一个例子来详细说明你的答案。我不是100%肯定我理解,但我有兴趣了解更多。例如,成功回调处理程序是否也会等到数据准备就绪后再尝试使用数据?我不是100%肯定我看到了后一种方法的优势,因为后者似乎更为普遍,但仍然可能达到相同的目标。当然,我会看看明天是否能带来一些东西
! 我现在在一台iPad上,所以像上面这样写一个答案需要30分钟。谢谢你,但是我怎么能在一个文字对象中做到这一点呢。我的意思是:这是在一个函数的内部。对象,我必须在哪里编写函数?成功回调函数是匿名的。它们不是用来返回数据的。它们被设计为在AJAX请求完成后接受从jQuery传入的数据,然后以其他方式将数据传递给回调处理程序或进程。AJAX是异步的,因此在我们等待数据时,它不会阻止其他函数的运行。如果它被阻止,整个页面将在您等待响应时挂起。这对用户来说是不和谐的。这样说,如果我误解了你的问题,考虑用更多的细节和例子来更新你的问题。祝你好运@马里奥-我用一个同步的例子更新了我的答案,并描述了为什么这是有害的。如果你想给你的用户一个快速的用户体验,你必须以不同的方式考虑JavaScript,因为它是异步的。您基本上必须将控制权移交给另一个函数。在您的情况下,将AJAX请求视为read_types函数所做的最后一件事,只需将数据交给另一个函数即可。@Mario-async的主要区别在于用户仍然可以与页面中仍然可见的其他部分进行交互,甚至在AJAX请求等待响应或在页面上呈现数据时。很高兴你成功了!祝你好运谢谢你,但是我如何在一个文本对象中做到这一点呢。我的意思是:这是在一个函数的内部。对象,我必须在哪里编写函数?成功回调函数是匿名的。它们不是用来返回数据的。它们被设计为在AJAX请求完成后接受从jQuery传入的数据,然后以其他方式将数据传递给回调处理程序或进程。AJAX是异步的,因此在我们等待数据时,它不会阻止其他函数的运行。如果它被阻止,整个页面将在您等待响应时挂起。这对用户来说是不和谐的。这样说,如果我误解了你的问题,考虑用更多的细节和例子来更新你的问题。祝你好运@马里奥-我用一个同步的例子更新了我的答案,并描述了为什么这是有害的。如果你想给你的用户一个快速的用户体验,你必须以不同的方式考虑JavaScript,因为它是异步的。您基本上必须将控制权移交给另一个函数。在您的情况下,将AJAX请求视为read_types函数所做的最后一件事,只需将数据交给另一个函数即可。@Mario-async的主要区别在于用户仍然可以与页面中仍然可见的其他部分进行交互,甚至在AJAX请求等待响应或在页面上呈现数据时。很高兴你成功了!祝你好运