
webview 版本 120.0.6099.43 实测 async 函数不执行
1 iOCZS 2023-12-31 20:56:56 +08:00 看看代码,async 是 ES2017 引入的特性 |
2 Vegetable 2023-12-31 21:26:43 +08:00 |
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 2024-01-01 00:56:18 +08:00 你这代码都是错的 waitUntilPresent 作用域下的参数 v 从你传入的时候就是一个 undefined 常量,根本无法检测 window.main 的引用变化 下面这个才对  |
5 mxT52CRuqR6o5 2024-01-01 00:59:02 +08:00 真不支持就直接报错了,你找个熟悉 js 的同事请教请教吧 |
6 okakuyang 2024-01-01 01:14:28 +08:00 大乌龙 |
7 |
8 CLMan 2024-01-01 01:55:48 +08:00 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 2024-01-01 02:26:02 +08:00 @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} ``` |