【问题标题】:How to solve this JavaScript scope issue如何解决这个 JavaScript 范围问题
【发布时间】:2012-08-01 14:01:51
【问题描述】:

我正在尝试使用 jQuery .get() 方法获取文件内容,如下所示

var news;
$.get('news.txt', function (dat) {
   news = dat;
   if ($('#removeN').is(':checked')) {
       news = "";
   }
   alert(news) // Displaying exact result;               
});
alert(news) // Displaying undefined..; Why?

有人请澄清我的疑问。

【问题讨论】:

  • 欢迎来到 async 的精彩世界!你不能那样做。
  • 改为进行同步调用?
  • 这里有很多副本...有人能找到合适的吗?
  • 复制是 Skrillex 窃取某人的材料。

标签: jquery ajax


【解决方案1】:

AJAX 是异步的

您的最后一行在您从服务器获得响应之前运行。

【讨论】:

    【解决方案2】:
    var news;
    $.get('news.txt', function (dat) {
       news = dat;
       if ($('#removeN').is(':checked')) {
           news = "";
       }
       alert(news) // BEFORE THIS!         
    });
    alert(news) // THIS EXECUTES
    

    如果你想对新闻做点什么,请改用这个:

    $.get('news.txt', function (dat) {
       news = dat;
       if ($('#removeN').is(':checked')) {
           news = "";
       }
       doSomething(news) // Displaying exact result;               
    });
    
    var doSomething = function(data) {
        alert(data);
    }
    

    【讨论】:

      【解决方案3】:

      您还应该能够分离出关注点..

      var news;
      $.get('news.txt', function (dat) {
         //process news       
      }).done(function(dat){
         //display news, or maybe more processing related to this particular function block
         alert(news);
      }).fail(function(){
         //oops, something happened in attempting to get the news.
         alert("failed to get the news");
      }).always(function(){
         //this eventually gets called regardless of outcome
      });
      

      等等

      【讨论】:

        【解决方案4】:

        $.get 的第二个参数是一个回调。本质上,$.get 所做的是为内容加载事件设置一个事件处理程序,并说“这是我想要在触发此事件时运行的函数”。就像其他人说的那样,它还没有触发那个事件,所以代码会漫无目的地寻找你未初始化的变量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-08
          • 1970-01-01
          • 2020-04-27
          • 2022-11-26
          • 1970-01-01
          • 2020-03-12
          相关资源
          最近更新 更多