JavaScript:Ajax请求后的全局变量

这个问题在这里已经有了答案:

  • 如何返回来自异步调用的响应? 33个答案

  • 你期望的是同步 (阻塞)类型的请求。

    var it_works = false;
    
    jQuery.ajax({
      type: "POST",
      url: 'some_file.php',
      success: function (data) {
        it_works = true;
      }, 
      async: false // <- this turns it into synchronous
    });​
    
    // Execution is BLOCKED until request finishes.
    
    // it_works is available
    alert(it_works);
    

    请求默认异步 (非阻塞),这意味着浏览器不会等待它们完成以继续其工作。 这就是为什么你的戒备得到错误的结果。

    现在,使用jQuery.ajax您可以选择将请求设置为同步 ,这意味着该脚本将只在请求完成后继续运行。


    然而, 推荐的方法是重构代码,以便数据在请求完成后立即传递给回调函数。 这是首选,因为阻止执行意味着阻止不可接受的UI。 这样做:

    $.post("some_file.php", '', function(data) {
        iDependOnMyParameter(data);
    });
    
    function iDependOnMyParameter(param) {
        // You should do your work here that depends on the result of the request!
        alert(param)
    }
    
    // All code here should be INDEPENDENT of the result of your AJAX request
    // ...
    

    异步编程稍微复杂一点,因为发出请求的结果被封装在一个函数中,而不是遵循请求语句。 用户体验的实时行为可能会更好,因为他们不会看到缓慢的服务器或缓慢的网络,导致浏览器表现得像崩溃一样。 同步编程是不尊重的不应该用于人们使用的应用程序。

    Douglas Crockford (YUI博客)


    AJAX代表异步JavaScript和XML。 因此,到服务器的帖子发生与该函数的其余部分不同步。 尝试一下这样的代码(它只是将简写$.post分解为更长的$.ajax调用并添加了async选项)。

    var it_works = false;
    
    $.ajax({
      type: 'POST',
      async: false,
      url: "some_file.php",
      data: "",
      success: function() {it_works = true;}
    });
    
    alert(it_works);
    

    希望这可以帮助!


    看来你的问题只是一个并发问题。 帖子函数需要一个回调参数来告诉你帖子何时完成。 你不能像这样在全球范围内发出警报,并且期望该帖子已经完成。 您必须将其移至回调函数。

    链接地址: http://www.djcxy.com/p/9477.html

    上一篇: JavaScript: Global variables after Ajax requests

    下一篇: How to make code wait while calling asynchronous calls like Ajax