V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
purenothingform
V2EX  ›  Android

WebView 竟然貌似不支持 js async 函数?

  •  
  •   purenothingform · 364 天前 via Android · 9083 次点击
    这是一个创建于 364 天前的主题,其中的信息可能已经有所发展或是发生改变。

    webview 版本 120.0.6099.43 实测 async 函数不执行

    12 条回复    2024-01-01 16:38:21 +08:00
    iOCZS
        1
    iOCZS  
       364 天前
    看看代码,async 是 ES2017 引入的特性
    Vegetable
        2
    Vegetable  
       364 天前
    https://caniuse.com/?search=async

    理论上安卓 5 以上应该就是 chrome 了,你的实测有问题
    purenothingform
        3
    purenothingform  
    OP
       364 天前
    @iOCZS
    ```
    async function waitUntilPresent(v){
    return new Promise((resolve, reject) => {
    const loop = () => v !== undefined ? resolve(v) : setTimeout(loop)
    loop();
    });
    }
    waitUnitPresent(window.main).then((main) => {
    }, reason => {

    });
    ```可能是 window.main 迟迟没有被赋值导致死循环
    lisongeee
        4
    lisongeee  
       364 天前   ❤️ 2
    你这代码都是错的

    waitUntilPresent 作用域下的参数 v 从你传入的时候就是一个 undefined 常量,根本无法检测 window.main 的引用变化

    下面这个才对

    ![image]( https://github.com/gkd-kit/gkd/assets/38517192/f932346b-9533-4c56-b737-2df30c6a06f8)
    mxT52CRuqR6o5
        5
    mxT52CRuqR6o5  
       364 天前
    真不支持就直接报错了,你找个熟悉 js 的同事请教请教吧
    okakuyang
        6
    okakuyang  
       364 天前
    大乌龙
    zjp
        7
    zjp  
       364 天前
    看发帖记录,遇到 bug 先检查下自己代码吧
    CLMan
        8
    CLMan  
       364 天前   ❤️ 1
    promise 是 es6 加的底层 API ,async 是 es8 加的语法糖。

    promise 不应该在 aysnc 函数里面使用,async 返回值会自动包装为 Promise 。

    promise 的问题是不够直观,写起来心智负担较大,能用 async 和 await 就尽量别用 promise 。

    ```
    function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
    }

    async function waitUntilPresent(w, callback) {
    while (w.main === undefined) {
    console.log("sleep");
    await sleep(100);
    }
    callback(w.main);
    }

    setTimeout(()=>{
    window.main = "hello";
    },1000);

    await waitUntilPresent(window, main => {
    console.log(main);
    });
    ```
    CLMan
        9
    CLMan  
       364 天前
    @CLMan 看了下,4 楼的代码写的比我好。
    CLMan
        10
    CLMan  
       364 天前
    @CLMan 更正,“promise 不应该在 aysnc 函数里面使用”是错误的,应该是 async 函数不需要手动返回 promise 。

    看了下 4 楼代码,确实学到了许多,特别是 promise 和 async 函数之间的关系。很多场合,async 函数还是没法替代 promise ,需要手撸 promise 。
    purenothingform
        11
    purenothingform  
    OP
       363 天前 via Android
    @zjp 嘿嘿好的
    purenothingform
        12
    purenothingform  
    OP
       363 天前
    @CLMan 为了兼容油猴插件用了以下错误写法导致的 bug
    ```
    typeof(unsafeWindow)==='undefined'?window.main:unsafeWindow.main=function() {//do something}
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   888 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 20:17 · PVG 04:17 · LAX 12:17 · JFK 15:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.