[英]Can I return data from an anonymous callback function in jQuery?
我敢肯定这很简单,但是我将探讨Javascript中的范围问题。 我正在执行以下操作:
$.get(url, function (data){console.log(data);});
这部分工作正常-我在控制台中看到了想要的字符串。 但是我真正想要的是获取该数据变量并将其放入字符串中。 这样的事情(无效):
string = $.get(url, function (data){return data;});
这为string
提供了[object XMLHttpRequest]
的值。
我想念什么?
是的,我错过了一个事实,正如其名称所说,Ajax是异步的。 谢谢大家给我拍我需要的额头。
我之所以不简单地使用回调函数内部的结果,是因为我实际上需要每隔几秒钟执行多个AJAX请求,收集数据并将它们全部添加到页面之后。
现在,我有了一个小的闭包功能-请求在一个循环中完成,并将数据传递到闭包。 当计时器关闭时,我不带参数的情况下调用了关闭函数,它告诉它“将您的前一批数据追加到页面上(请求现在肯定已经完成了),清除了缓存,并准备开始从中接收新数据我的循环中的AJAX回调。”
哪一个(希望)表明我毕竟不是白痴。 :)
.get()
发送AJAX GET HTTP请求并立即返回,这意味着您不能仅将结果分配给变量,因为结果仅在成功回调(您作为第二个参数传递的匿名函数)中可用。 在此回调中,您可以调用其他函数并将数据作为变量传递。 这就是AJAX的工作方式。 A
代表异步。
从回调函数返回数据仅将其返回给该回调函数的调用者,即jQuery,它对此不执行任何操作。
您不能做的就是将该值从回调函数传递到周围函数的赋值中,而您之所以不能这样做,是因为这将花费时间。 get()
方法立即返回,在后台启动一个HTTP请求,该请求稍后将完成。 这样做时,将调用回调函数,但到那时该string
已很久就被分配了。
您不能同步调用异步代码,反之亦然。 如果要对HTTP请求的结果进行处理,则只能在回调函数中进行处理。 如果要提供一个发出HTTP请求并将结果传回的函数,则必须自己接受并调用一个回调函数来做到这一点:
function getThing(callback) {
...
$.get(url, function(data) {
callback(data);
});
}
另一种方法是使用async: false
同步完成全部操作。 但这对每个人来说都是个坏消息,因为网络浏览器会挂起直到请求完成。
Ajax请求是异步完成的1 ,JQuery的ajax函数的最后一个参数是回调。 要回答为什么第二个示例不起作用,您需要了解异步回调 。 或者,这类似于观察者模式,其中observable
observer
是Ajax请求, observer
是回调。 执行请求的步骤大致是:
回调中的参数data
到达步骤6,而$.get()
调用返回到步骤2。因此您的数据不可用。 您需要在第6步中的某个变量中设置数据,然后从那里进行处理。
1个请求可以同步完成,但是Ajax中的A代表Asynchronous 。 可以使用$.get()
来执行同步请求,但是从技术上讲,它不能称为“ Ajax”。 我的观点。
传递给匿名函数的数据变量就是ajax对象本身。 如果要从服务器返回响应文本,请执行以下操作:
$.get(url,
// data to send
{
'foo' : 'bar'
},
// receive response
function(response){
return response;
} // response callback function
); // .get()
您可以执行以下两项操作之一:
1-将GET更改为与{async: false }
同步,您可能需要使用$ .ajax方法。 然后在成功回调中分配变量。
2-将使用变量的所有内容放入成功回调中。
$.get(url, function (data){
var string = data;
useMyString(string);
});
这是您要尝试的:
var data = $.get(url, function(data){return data;});
// trying to do the stuff you want to do with data
这是您需要做的:
$.get(url, function(data){
// do the stuff you want to do with data
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.