(并不是要创建一个新问题,而是修改old one足以使答案没有意义,现在又出现了新问题)
当谈到jQuery时,我是一个完全的菜鸟,但我正在努力学习。我在这里做错了什么?
function MakeCall(url) {
var result;
$.ajax({
url: url,
dataType: "text",
success: function(txt) {
result = txt;
alert(result);
return;
}
});
alert(result);
return result;
}
我的问题是第一个警报返回正确的值,但第二个警报返回“未定义”并且在第一个警报之前弹出,即使结果在成功函数中正确设置...叹息。 .. 我究竟做错了什么? :(
非常感谢...
答案 0 :(得分:3)
Jquery的ajax函数是异步的 - 因此在运行第二个警报后,成功函数将被称为。然后它将在ajax方法完成之前从函数返回。
如果您真的想以这种方式构建应用,可以在呼叫中添加 async 选项,将其设置为false。 (http://docs.jquery.com/Ajax/jQuery.ajax#options,请参阅第一个条目。)这将导致在$ .ajax方法返回之前调用success函数。
但是,建议不要阻止ajax调用,因为它会挂起脚本和浏览器。
因此,我建议您重新构建应用程序:
function MakeCall(url, callback) {
$.ajax({
url: url,
dataType: "text",
success: callback
});
}
MakeCall('http://theurl.com', function(txt) {
result = txt;
alert(result);
return;
});
答案 1 :(得分:2)
使用XHR时没有“等待”的好概念(好的,是的,你可以让它同步,但它会锁定浏览器一些激烈的东西)。相反,您可以利用函数可以在javascript中作为参数轻松传递。
这里的关键是你定义的“成功”功能在服务器调用回来之前不会运行,但是你的其余javascript会继续运行,触发你所看到的未定义警报(和运行任何调用此函数的代码等。)
您必须在数据到达时向函数调用者发出警报,而不是从函数返回数据。您可以通过添加第二个参数来实现,即在服务器请求完成时调用的函数:
function MakeCall(url, functionToRunWhenDataArrives) {
$.ajax({
url: url,
dataType: "text",
success: functionToRunWhenDataArrives
});
}
MakeCall('myurl.com', function(txt){
// do stuff with txt here!
});
这是您在发出异步请求时必须遵循的模式类型。
答案 2 :(得分:0)
Ajax是异步的,它不会阻止流。所以它的工作原理如下:
jQuery有一个标志可用于使请求同步,但通常认为这样做不好。