Javascript 包装jquery函数并返回一个值

Javascript 包装jquery函数并返回一个值,javascript,jquery,function,Javascript,Jquery,Function,我可以包装这段代码,以便在调用时函数返回包含json对象的变量吗 例如: function GetNewSomething() { var newtb = 0; $.get("/something/new", function (data) { newtb = data; } ); return newtb;

我可以包装这段代码,以便在调用时函数返回包含json对象的变量吗

例如:

   function GetNewSomething() {
        var newtb = 0;
        $.get("/something/new",
                function (data) {
                    newtb = data;
                }
                );
        return newtb; // as of now this always returns undefined...
    }
尝试此方法,但仅返回未定义

提前谢谢各位


您好,

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

function GetNewSomething(cb) {
    $.get("/something/new", cb);
}
并称之为:

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


哦,如果响应是一个JSON字符串,您可能需要使用它将响应解码为JavaScript对象。

get是异步的,这就是为什么在get请求返回时向它传递一个要调用的函数。

.get()
$.ajax()的包装。如果没有明确配置,则所有AJAX请求都会异步运行。这反过来意味着,
返回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
});

您可以更改为使
$.get
成为
$.ajax
并使其同步,因为
$.get
只是
$的包装器。ajax

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

是的,理论上是可能的,但在大多数情况下,这是个坏主意。根据得到答案所需的时间,这会降低所有性能和可用性。除非您知道自己在做什么,否则请避免
async:false
@Felix Kling-我同意,并且您的方式是在这种情况下的适当方式。我只是提供了另一种方法。此外,根据此调用是否是正在进行的唯一处理,处理似乎会暂停,直到$.get完成并点击回调。同样,这取决于场景。@Raynos-我同意,但人们也应该明白,他们可以使用它,但只能在正确的情况下使用。@amurra:你说得对,这取决于场景,这是一个完全正确的答案。但我会包括它可能存在的缺点。否则,经验不足的开发人员可能会将其应用到所有地方,并想知道为什么他们的东西、浏览器等速度如此之慢;)'不要叫我们,我们叫你,爱它:)