上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: 琦玉 - 

请问大佬们XMLHttpRequest根据json返回变量的问题

[复制链接]
  • TA的每日心情
    无聊
    2023-9-5 15:56
  • 签到天数: 54 天

    [LV.5]常住居民I

    14

    主题

    75

    回帖

    112

    积分

    中级工程师

    积分
    112
    发表于 2022-8-15 22:38:50 | 显示全部楼层
    wwwwwllllk 发表于 2022-8-15 21:04
    先输出下xhr,然后再看下取得是哪个里面得数据

    输出XHR都在函数执行之后
    回复
    订阅

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-8-15 22:49:21 | 显示全部楼层
    xhr.open(method, url, true);
    第三个参数设置为true,然后在onload里接收返回值。还可以试试这个:https://bbs.tampermonkey.net.cn/thread-2793-1-1.html
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-9-5 15:56
  • 签到天数: 54 天

    [LV.5]常住居民I

    14

    主题

    75

    回帖

    112

    积分

    中级工程师

    积分
    112
    发表于 2022-8-16 08:52:22 | 显示全部楼层
    cxxjackie 发表于 2022-8-15 22:49
    xhr.open(method, url, true);
    第三个参数设置为true,然后在onload里接收返回值。还可以试试这个:https:/ ...

    请问大佬,第三个参数默认不就是true吗?
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    294

    主题

    3908

    回帖

    3829

    积分

    管理员

    积分
    3829

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2022-8-16 09:41:29 | 显示全部楼层
    要不看一下这块?
    [油猴脚本开发指南]脚本ajax的跨域请求
    https://bbs.tampermonkey.net.cn/thread-136-1-1.html
    (出处: 油猴中文网)


    看错以为是GM_XMLHttpRequest
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-8-16 11:56:01 | 显示全部楼层
    琦玉 发表于 2022-8-16 08:52
    请问大佬,第三个参数默认不就是true吗?

    你还是把完整代码贴出来吧,这样描述根本摸不着头脑。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    294

    主题

    3908

    回帖

    3829

    积分

    管理员

    积分
    3829

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2022-8-16 16:19:58 | 显示全部楼层
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-9-5 15:56
  • 签到天数: 54 天

    [LV.5]常住居民I

    14

    主题

    75

    回帖

    112

    积分

    中级工程师

    积分
    112
    发表于 2022-8-18 07:55:49 | 显示全部楼层
    cxxjackie 发表于 2022-8-16 11:56
    你还是把完整代码贴出来吧,这样描述根本摸不着头脑。
    1. function  orderDeployInfo(order_num){
    2.     var xhr = new XMLHttpRequest();
    3.     xhr.open("GET", url, true);
    4.     xhr.onload = function (e) {
    5.         if (xhr.readyState === 4) {
    6.             if (xhr.status === 200) {
    7.                 let xhrString = JSON.parse(xhr.response)
    8.                 console.log(xhrString.flag); //true
    9.                 return xhrString.flag
    10.             } else {
    11.                 console.error(xhr.statusText);
    12.                 return xhr.responseText
    13.             }
    14.         }
    15.     };
    16.     xhr.onerror = function (e) {
    17.         console.error(xhr.statusText);
    18.     };
    19.     xhr.send(null);
    20. }


    21. if (orderDeployInfo('XD220817139')) {

    22.     console.log('ok')
    23. }
    复制代码


    代码大概就是这样,这里确定xhr 100% 返回xhrString.flag ,但是不会打印OK,因为异步加上延时,如果open里改成false,就可以打印ok,但是这段代码放在油猴上却不能实现,是不是油猴不支持同步,怕阻塞程序?
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-8-18 22:19:05 | 显示全部楼层
    琦玉 发表于 2022-8-18 07:55
    代码大概就是这样,这里确定xhr 100% 返回xhrString.flag ,但是不会打印OK,因为异步加上延时,如果op ...

    你这属于把异步当同步来写了,即使xhr改同步,orderDeployInfo这个函数还是没有返回值(你在onload里return的是onload的返回值),所以if的判断条件永远是undefined,当然永远不会输出ok。解决方法要么就彻底改同步,open改false,onload里的代码移到send之后,要么就用Promise封装成异步。同步xhr的做法非常不推荐,因为会阻塞主线程,表现就是浏览器看起来像卡死了一样。Promise封装可以参考论坛开发指南里那几篇Promise的文章,也可以用我前面发的那个ajax库,像这个例子的用法示例如下:
    1. (async function() {
    2.     const res = await ajax(url, {responseType: 'json'});
    3.     if (res.flag) {
    4.         console.log('ok');
    5.     }
    6. })();
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-9-5 15:56
  • 签到天数: 54 天

    [LV.5]常住居民I

    14

    主题

    75

    回帖

    112

    积分

    中级工程师

    积分
    112
    发表于 2022-8-19 16:02:47 | 显示全部楼层
    cxxjackie 发表于 2022-8-18 22:19
    你这属于把异步当同步来写了,即使xhr改同步,orderDeployInfo这个函数还是没有返回值(你在onload里retu ...

    其实我就想要同步的效果,程序远比这复杂,首先查询库存是否够,然后修改备注,再审核,但是现实往往可能还没修改备注就审核掉了,或者同时审核2张单,服务器又会报错,所以我就想程序顺序执行,而不是异步。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-14 00:00
  • 签到天数: 119 天

    [LV.6]常住居民II

    29

    主题

    599

    回帖

    536

    积分

    专家

    积分
    536

    油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-8-19 16:59:06 | 显示全部楼层
    琦玉 发表于 2022-8-19 16:02
    其实我就想要同步的效果,程序远比这复杂,首先查询库存是否够,然后修改备注,再审核,但是现实往往可能 ...

    如果是在战争年代,你早已经被鬼子一枪干死了
    说话吞吞吐吐,还往怀里口袋里掏,你到底在掏什么,难道是掏枪?下一秒肯定你就硬了,这和抗日神剧肯定不一样

    你觉得很复杂的程序,在这帮大佬们看来就像吃完饭顺带又啃了小姨子一口那么简单

    1:首先查询库存是否够,这需要联网吧?
    2:然后修改备注,这是你主动修改备注吧?要不要联网?
    3:再审核,审核是服务器审核吧?
    4:但是现实往往可能还没修改备注就审核掉了???
    只要是联网它都是一条一条发送,也是一条一条接收,哪有同时的道理,你是自己都搞糊涂了
    我觉得这事得从头捋一遍
    入驻爱发电 让这世界充满爱 https://afdian.net/a/vpannice
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表