在jQuery函数之外获取JSON响应变量?
我有以下jQuery函数:在jQuery函数之外获取JSON响应变量?,jquery,json,variables,var,Jquery,Json,Variables,Var,我有以下jQuery函数: function deleteHype(){ FB.api('/me/launchhype:hype', function(response) { $.each(response.data, function(i, obj){ if (obj.data.launch.url == '<?php the_permalink(); ?>') {
function deleteHype(){
FB.api('/me/launchhype:hype', function(response) {
$.each(response.data, function(i, obj){
if (obj.data.launch.url == '<?php the_permalink(); ?>') {
var delete_launch_id = parentObj=obj.id;
}
});
});
}
alert(delete_launch_id);
函数deleteHype(){
api('/me/launchhype:hype',函数(响应){
$.each(response.data,function(i,obj){
如果(obj.data.launch.url=''){
var delete_launch_id=parentObj=obj.id;
}
});
});
}
警报(删除启动id);
假设在IF语句中,变量“delete\u launch\u id”是“X”。如果我尝试在函数外执行“delete_launch_id”警报,它是“undefined”。我希望它返回“X”(设定的假设值)
我该怎么做?我迷路了,似乎找不到类似的示例。将变量声明为全局变量(或在需要时可以访问的命名空间中) 问题是,一旦你这样做了,你需要担心什么时候访问它,以及在那个时候访问它是否合理。更好的解决方案取决于你实际想做什么
但是,一般来说,最好将这种异步内容保持在本地,并使用函数来操纵回调中的状态。例如,您可以将一个函数传递给
deleteHype
,该函数对ID做了“正确”的处理,在回调中执行工作,从回调或传递给它的函数中操作DOM,等等。将变量声明为全局变量(或在需要时可以访问的命名空间中)
问题是,一旦你这样做了,你需要担心什么时候访问它,以及在那个时候访问它是否合理。更好的解决方案取决于你实际想做什么
但是,一般来说,最好将这种异步内容保持在本地,并使用函数来操纵回调中的状态。例如,您可以将一个函数传递给
deleteHype
,该函数使用ID做了“正确”的事情,在回调中执行工作,从回调或传递给它的函数中操作DOM,等等。我不想解释为什么您无法在代码中的该点“看到”delete\u launch\u ID的所有原因,但也许像这样的事情会奏效
function deleteHype(callback){
FB.api('/me/launchhype:hype', function(response) {
$.each(response.data, function(i, obj){
if (obj.data.launch.url == '<?php the_permalink(); ?>') {
if(typeof callback === 'function') {
callback(obj.id);
}
}
});
});
}
deleteHype(function(delete_launch_id) {
alert(delete_launch_id);
});
函数deleteHype(回调){
api('/me/launchhype:hype',函数(响应){
$.each(response.data,function(i,obj){
如果(obj.data.launch.url=''){
if(回调类型==='function'){
回调(对象id);
}
}
});
});
}
deleteHype(功能(删除启动id){
警报(删除启动id);
});
我不会详细解释为什么您无法在代码中的该点“查看”删除\u launch\u id,但类似的操作可能会起作用:
function deleteHype(callback){
FB.api('/me/launchhype:hype', function(response) {
$.each(response.data, function(i, obj){
if (obj.data.launch.url == '<?php the_permalink(); ?>') {
if(typeof callback === 'function') {
callback(obj.id);
}
}
});
});
}
deleteHype(function(delete_launch_id) {
alert(delete_launch_id);
});
函数deleteHype(回调){
api('/me/launchhype:hype',函数(响应){
$.each(response.data,function(i,obj){
如果(obj.data.launch.url=''){
if(回调类型==='function'){
回调(对象id);
}
}
});
});
}
deleteHype(功能(删除启动id){
警报(删除启动id);
});
您需要做的是将变量作为参数在两个函数之间传递
function deleteHype(){
FB.api('/me/launchhype:hype', function(response) {
$.each(response.data, function(i, obj){
if (obj.data.launch.url == '<?php the_permalink(); ?>') {
var delete_launch_id = parentObj=obj.id;
}
});
});
}
function grabID(delete_launch_id){
alert(delete_launch_id);
}
现在,您可以在需要输出delete_launch_id的地方使用grabId。您需要做的是将变量作为参数在两个函数之间传递
function deleteHype(){
FB.api('/me/launchhype:hype', function(response) {
$.each(response.data, function(i, obj){
if (obj.data.launch.url == '<?php the_permalink(); ?>') {
var delete_launch_id = parentObj=obj.id;
}
});
});
}
function grabID(delete_launch_id){
alert(delete_launch_id);
}
现在,您可以在需要输出delete\u launch\u id的地方使用grabId。根据流行的需求,这里将更深入地了解为什么变量“delete\u launch\u id”在“alert”函数访问时不可用 有几件事正在发生 首先,FB.api函数很可能是一个异步AJAX调用。JavaScript并不是真正的异步(目前),但在本例中,它实际上是异步的。这意味着,当异步代码执行时,之后的代码将继续执行,而异步代码将等待响应。因此,如果您调用“deleteHype”,然后紧接着调用“alert”,则在调用“alert”时,FB.api响应很可能不会返回。因此,异步代码中设置的任何内容都将不可用 第二个问题是JavaScript具有“函数作用域”。这在实践中意味着,函数中定义的变量只能在该函数中使用。它在该功能中只有“作用域”。考虑下面的代码:
var foo = 1;
if(1 === 1) {
// non-function block. foo is accessible in here, and any changes to foo will be seen outside this block.
foo = 2;
}
// foo is 2
function change() {
// functional scope. variables defined in here are only available here
foo = 3;
var bar = 1;
}
// foo is 2 because we haven't called change yet
// bar is "undefined"
change();
// foo is 3
// bar is "undefined"
“foo”已更改,因为它的作用域在函数外部,因此函数可以访问它。
然而,“bar”只在该函数中有作用域,不存在于其他任何地方
在最初的示例中,“delete_launch_id”实际上是在几个函数中声明的,因此它在其他任何地方都不可用
我的第一个回答通过将函数作为“回调”传递到“deleteType”函数中来解决这些问题,只有在异步代码完成并返回时才会调用该函数。处理问题1。然后,回调函数将“delete\u launch\u id”传递给它,从而使其可用。我给出的格式可能有点奇怪:
deleteHype(function(delete_launch_id) {
// alert
});
这里的情况是,我们实际上是把一个函数作为变量传递。这是一个“匿名”函数(没有名字)。所以deleteType treats就像一个变量(因为它是),并且可以调用它,因为它是一个函数,当调用它时,其中的代码将执行。这是一个非常方便的模式
我希望这有点帮助。首先,这是一个令人困惑的问题。根据流行的需求,这里更深入地分析了为什么变量“delete\u launch\u id”在“alert”函数访问时不可用 有几件事正在发生 首先,FB.api函数很可能是一个异步AJAX调用。JavaScript还不是真正的异步,但在本例中,它有效地