代码之家  ›  专栏  ›  技术社区  ›  Gal

JavaScript:Ajax请求后的全局变量[duplicate]

  •  46
  • Gal  · 技术社区  · 16 年前

    var it_works = false;
    
    $.post("some_file.php", '', function(data) {
    
         it_works = true;
    
    });
    
    alert(it_works); # false (yes, that 'alert' has to be here and not inside $.post itself)
    

    我想要实现的是:

    alert(it_works); # true
    

    $.post() 返回要应用于的值 it_works ?

    4 回复  |  直到 16 年前
        1
  •  102
  •   gblazex    11 年前

    你所期待的是 同步 舞台调度

    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
    // ...
    

    异步 编程稍微复杂一些 复杂的 发出请求的方法被封装在函数中,而不是跟随请求语句。 实时行为 用户体验 可以是 明显地 更好的 因为他们不会看到一个缓慢的服务器或缓慢的网络造成的问题 浏览器似乎崩溃了。 同步 编程是 无礼的 不应该被雇用

    道格拉斯·克罗克福德 ( YUI Blog

        2
  •  6
  •   mattbasta    16 年前

    AJAX代表异步JavaScript和XML。因此,到服务器的post与函数的其余部分不同步。试试这样的代码(它只是打破了速记法) $.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);
    

        3
  •  5
  •   Hosam Aly    16 年前

    似乎您的问题只是一个并发问题。post函数使用回调参数来告诉您post何时完成。您不能在全局范围内发出这样的警报,并期望post已经完成。你必须把它移到回调函数。

        4
  •  3
  •   Jesse Dhillon    16 年前

    post() 将启动一个 asynchronous 请求服务器。这对你来说意味着 发布() 不 在请求完成之后,就像您期望的那样。

    那么,您需要的是使请求同步并阻塞当前线程,直到请求完成。因此,

    var it_works = false;
    
    $.ajax({
      url: 'some_file.php',
      async: false,  # makes request synchronous
      success: function() {
        it_works = true;
      }
    });
    
    alert(it_works);