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

357 天前
 purenothingform

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

8968 次点击
所在节点    Android
12 条回复
iOCZS
357 天前
看看代码,async 是 ES2017 引入的特性
Vegetable
357 天前
https://caniuse.com/?search=async

理论上安卓 5 以上应该就是 chrome 了,你的实测有问题
purenothingform
357 天前
@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
357 天前
你这代码都是错的

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

下面这个才对

![image]( https://github.com/gkd-kit/gkd/assets/38517192/f932346b-9533-4c56-b737-2df30c6a06f8)
mxT52CRuqR6o5
357 天前
真不支持就直接报错了,你找个熟悉 js 的同事请教请教吧
okakuyang
357 天前
大乌龙
zjp
357 天前
看发帖记录,遇到 bug 先检查下自己代码吧
CLMan
357 天前
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
357 天前
@CLMan 看了下,4 楼的代码写的比我好。
CLMan
357 天前
@CLMan 更正,“promise 不应该在 aysnc 函数里面使用”是错误的,应该是 async 函数不需要手动返回 promise 。

看了下 4 楼代码,确实学到了许多,特别是 promise 和 async 函数之间的关系。很多场合,async 函数还是没法替代 promise ,需要手撸 promise 。
purenothingform
357 天前
@zjp 嘿嘿好的
purenothingform
356 天前
@CLMan 为了兼容油猴插件用了以下错误写法导致的 bug
```
typeof(unsafeWindow)==='undefined'?window.main:unsafeWindow.main=function() {//do something}
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1004843

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX