Javascript 包装jquery函数并返回一个值
我可以包装这段代码,以便在调用时函数返回包含json对象的变量吗 例如:Javascript 包装jquery函数并返回一个值,javascript,jquery,function,Javascript,Jquery,Function,我可以包装这段代码,以便在调用时函数返回包含json对象的变量吗 例如: function GetNewSomething() { var newtb = 0; $.get("/something/new", function (data) { newtb = data; } ); return newtb;
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:你说得对,这取决于场景,这是一个完全正确的答案。但我会包括它可能存在的缺点。否则,经验不足的开发人员可能会将其应用到所有地方,并想知道为什么他们的东西、浏览器等速度如此之慢;)'不要叫我们,我们叫你,爱它:)