【问题标题】:losing data when leaving scope离开范围时丢失数据
【发布时间】:2015-05-27 13:22:15
【问题描述】:

我正在用 javascript 编程,有一次我进行了 ajax 调用 我将数据存储在对象文字中,但是当我离开范围时,我会丢失数据(即使在我的对象文字中)

我不明白这里发生了什么

var menusView = {
menusRep: null,
init: function () {
    this.menusRep = menusRepository;
    this.getMenus();
},
getMenus: function () {

    $.ajax({
        url: 'data/voordeelmenus.json',
        dataType: 'json',
        success: function (data) {
            menusView.menusRep.menus = data;
            console.log(data);//console output: [object, object,...]
            console.log(menusView.menusRep.menus);//console output: [object, object,...]
        },
        error: function (error) {
            alert("error reading file: " + error);
        }
    });

    console.log(menusView.menusRep.menus); //console output: []

}
}

var menusRepository = {
menus: []
}

我想我包含了所有重要的代码 提前致谢!

【问题讨论】:

    标签: javascript ajax scope


    【解决方案1】:

    我相信这是由于 AJAX 的异步特性以及您使用它的方式。最终的 console.log 在 AJAX 调用完成之前触发,因此在创建 console.log 时数据不可用。

    在我看来,您有几个选择。您可以在成功回调中使用返回的数据,在成功回调中使用另一个处理返回数据的方法,或者您可以将 async 设置为 false 以阻塞方式处理 AJAX 请求。

     $.ajax({
        url: 'data/voordeelmenus.json',
        dataType: 'json',
        async: false,
        success: function (data) {
            menusView.menusRep.menus = data;
            console.log(data);//console output: [object, object,...]
            console.log(menusView.menusRep.menus);//console output: [object, object,...]
        },
        error: function (error) {
            alert("error reading file: " + error);
        }
    });
    

    【讨论】:

      【解决方案2】:

      你基本上有 2 行

       $.ajax(...)
      console.log(...)
      

      ajax 行调度一个 ajax 调用和一个回调,当 ajax 调用返回时将调用该回调,但不会阻塞:它是异步的。

      在安排好之后,console.log 被调用,但菜单尚未设置。它只会在稍后 ajax 调用返回时设置。

      【讨论】:

        【解决方案3】:

        您的 ajax 调用是异步的。

        所以当你的代码执行到 console.log(menusView.menusRep.menus); 那时您的对象没有收到任何数据。

        把你的 console.log(menusView.menusRep.menus); ajax 调用成功处理程序内部

        【讨论】:

          【解决方案4】:

          那个

           console.log(menusView.menusRep.menus); //console output: []
          

          必须在 ajax 调用中,因为它是异步的。否则永远是空的

          编辑:记住调用

           menusView.init();
          

          否则 menusView.menusRep 将为 null

          希望对你有帮助,

          【讨论】:

          • 但是 ajax 调用背后的全部含义是我可以将菜单存储在 menusRepository 中。 (所以我只需要 1 个 ajax 调用)现在它一离开范围就会删除数据
          • 那你应该在ajax里面做调用 menusRepository = [something]
          • 我不要在 menusView.menusRep.menus = data;那么呢?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-06-16
          • 1970-01-01
          • 2017-04-04
          • 1970-01-01
          • 1970-01-01
          • 2019-08-08
          • 2019-10-21
          相关资源
          最近更新 更多