2011-01-20 67 views
3

你可以包装这段代码,以便当一个函数的调用返回变量contianing json对象吗?包装一个jquery函数并返回一个值

例子:

function GetNewSomething() { 
     var newtb = 0; 
     $.get("/something/new", 
       function (data) { 
        newtb = data; 
       } 
       ); 
     return newtb; // as of now this always returns undefined... 
    } 

提前家伙试过这种方法,但只能返回undefined ..

谢谢!

关于,

回答

6

你不能。 Ajax调用是异步的。你必须回调传递给你的函数:

function GetNewSomething(cb) { 
    $.get("/something/new", cb); 
} 

,并称之为:

GetNewSomething(function(data) { 
    // do something with data 
}); 

I wrote something about it

哦,如果响应是JSON字符串,则可能需要使用.getJSON,它也将响应解码为JavaScript对象。

+0

'不要打电话给我们,我们打电话给你',爱它:) – Maher4Ever 2011-01-20 13:09:59

0

$.get是异步的,这就是您传递函数以便在请求返回时调用的原因。

3

.get()$.ajax()的包装。如果未明确配置,则所有AJAX请求均异步运行。这又意味着,您的return newtb;声明将在$.get()完成之前发生。

解决此问题的一个好方法是自行调用另一个回调。这可能是这样的:

function GetNewSomething(callback) { 
    $.get("/something/new", 
      function (data) { 
       if(typeof callback === 'function') 
        callback.apply(this, [data]); 
      } 
      ); 
} 

然后调用它像

GetNewSomething(function(data) { 
    // do something with data 
}); 
0

你可以改变,使$.get一个$.ajax,使之syncronous因为$.get仅仅是一个$.ajax的包装:

function GetNewSomething() { 
     var newtb = 0; 
     $.ajax({url:"/something/new", 
       type:"GET", 
       async:false, 
       success: function (data) { 
        newtb = data; 
       } 
      }); 
     return newtb; 
    } 
+0

是的,理论上可行,但在大多数情况下是一个坏主意。取决于获得答案需要多长时间,这会杀死所有性能和可用性。 – 2011-01-20 13:01:20

相关问题