V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
KirbySD
V2EX  ›  JavaScript

jQuery 的 getJSON 方法有时会失败?

  •  
  •   KirbySD · 2017-04-12 20:58:57 +08:00 · 4730 次点击
    这是一个创建于 2564 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大致像这样

    $.getJSON("jsonpath", {}, function (data) {
            jsondata = data;
    }, "json");
    

    接着调用这个 jsondata 对象时有一定几率会报错

    Uncaught ReferenceError : data is not defined
    

    然而并不是每次都报错,十分神奇。在 console 里面查看 jsondata 的内容时是正确加载进去了。

    P.S 原来 js 里用的 jQuery 调用与原生 js 调用混合,后来我把原生调用改写成了 jQuery 调用后不报错了,然而还是有加载失败的现象,直接后果就是要加载到 table 里的数据无法加载, table 空白。

    js 文件: github.com/DiruSec/PSO2-EQ-Schedule/blob/master/script/parser.js

    应用地址: time.dirusec.com

    P.S 2 基本没学过 js ,写起来一泡污,求轻喷(´・ω・`)

    第 1 条附言  ·  2017-04-13 01:03:47 +08:00
    自己解决了,说一下思路
    我的 js 大概顺序如下:
    初始化变量对象→将 json 文件读入 object ( 3 个)→执行主要代码(作为 function ,将 3 个 object 的内容写入 html table )

    通过设置断点观察之后发现,有些时候在 json 读入完毕之前主要代码就已经被执行了,导致写入 html table 时 object 的内容是空的
    因此解决思路就是保证所有的 json 都读入完毕后才执行主要代码
    由于不知道有什么好用的方法,所以采用了将$.getJSON 方法层层嵌套到 success 部分的方法,虽然应该会牺牲一部分的性能,但可以保证三个 json 都读取成功
    9 条回复    2017-04-13 11:54:01 +08:00
    lxf1992521
        1
    lxf1992521  
       2017-04-12 22:47:14 +08:00
    一般 get 方法出错基本上都是因为 cache 的原因,试试 $.ajaxSetup({cache:false})
    iot
        2
    iot  
       2017-04-12 22:48:43 +08:00
    $.getJSON("jsonpath", callback);

    获取到数据之后, callback 才会执行。

    你那样写, callback 还没执行呢,你下面的代码就想用获取到的数据,肯定报错咯
    alex321
        3
    alex321  
       2017-04-12 22:59:43 +08:00 via Android
    data 的输出格式看下,可能是字符串了。前端保险一些用 JSON.paser 一下。
    KirbySD
        4
    KirbySD  
    OP
       2017-04-12 23:54:08 +08:00
    @lxf1992521 感觉有缓解(心理作用?),不过还是有这种现象

    @iot 看了一下文档,好像 function 部分是获取到数据后才会执行……?

    @alex321 console 里看了一下,输出是 Object 没错……

    这个问题不是每次都出现,而是每次刷新时有几率出现,目前的想法可能是 json 没完全读取就继续执行下面的代码了…但是在 console 里调用对象的话确实是正确加载了
    1010011010
        5
    1010011010  
       2017-04-13 02:35:49 +08:00
    请求完成才会执行 callback 。

    出错时查看 network 看看返回是不是正确的 json 。
    duan602728596
        6
    duan602728596  
       2017-04-13 09:01:58 +08:00 via iPhone
    js 的 ajax 是异步的。 Promise 大法好
    dtysky
        7
    dtysky  
       2017-04-13 09:28:41 +08:00
    。。。 LZ 还是先学一下 WEB 前端开发基础再写代码吧
    异步和同步这个坑刚入门的时候我也踩过

    你需要见识一下回调地狱 2333 然后转 Promise
    way
        8
    way  
       2017-04-13 10:27:50 +08:00
    Promise 大法好
    MinonHeart
        9
    MinonHeart  
       2017-04-13 11:54:01 +08:00
    用 $.when
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2830 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:27 · PVG 21:27 · LAX 06:27 · JFK 09:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.