为什么这个jQuery函数不能正常运行? (修正)

时间:2009-05-29 21:05:27

标签: jquery

(并不是要创建一个新问题,而是修改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;
}

我的问题是第一个警报返回正确的值,但第二个警报返回“未定义”并且在第一个警报之前弹出,即使结果在成功函数中正确设置...叹息。 .. 我究竟做错了什么? :(

非常感谢...

3 个答案:

答案 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是异步的,它不会阻止流。所以它的工作原理如下:

  • 您调用$ .ajax,请求发送到服务器
  • 代码在$ .ajax调用后进入警报,因为它仍未完成请求,结果变量仍未定义
  • 一段时间后,请求结束,并使用结果
  • 调用success函数中的警报

jQuery有一个标志可用于使请求同步,但通常认为这样做不好。