webview 版本 120.0.6099.43 实测 async 函数不执行
1
iOCZS 305 天前
看看代码,async 是 ES2017 引入的特性
|
2
Vegetable 305 天前
|
3
purenothingform OP @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 迟迟没有被赋值导致死循环 |
4
lisongeee 305 天前 2
你这代码都是错的
waitUntilPresent 作用域下的参数 v 从你传入的时候就是一个 undefined 常量,根本无法检测 window.main 的引用变化 下面这个才对 ![image]( https://github.com/gkd-kit/gkd/assets/38517192/f932346b-9533-4c56-b737-2df30c6a06f8) |
5
mxT52CRuqR6o5 305 天前
真不支持就直接报错了,你找个熟悉 js 的同事请教请教吧
|
6
okakuyang 305 天前
大乌龙
|
7
zjp 305 天前
看发帖记录,遇到 bug 先检查下自己代码吧
|
8
CLMan 305 天前 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); }); ``` |
10
CLMan 305 天前
@CLMan 更正,“promise 不应该在 aysnc 函数里面使用”是错误的,应该是 async 函数不需要手动返回 promise 。
看了下 4 楼代码,确实学到了许多,特别是 promise 和 async 函数之间的关系。很多场合,async 函数还是没法替代 promise ,需要手撸 promise 。 |
11
purenothingform OP @zjp 嘿嘿好的
|
12
purenothingform OP @CLMan 为了兼容油猴插件用了以下错误写法导致的 bug
``` typeof(unsafeWindow)==='undefined'?window.main:unsafeWindow.main=function() {//do something} ``` |