runJavaScript执行异步方法无法获取返回值的原因如下:
runJavaScript本身以异步方式执行,可视为一个异步方法,在当前调用机制下,尚无可行方案直接获取执行异步方法的返回值。
因此我们只能从其他角度加以考虑。
进而解决了runJavaScript执行异步方法无法获取返回值的问题。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>title</title>
</head>
<body>
<p>Web端页面</p>
</body>
<script>
function generateAsyncResult(a, b, c) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(`异步返回${a}、${b}、${c}`)
}, 1000)
})
}
async function asyncMethod(a, b, c) {
const result = await generateAsyncResult(a, b, c)
javaScriptProxy.syncCallback(result)
}
</script>
</html> import { webview } from '@kit.ArkWeb';
class JavaScriptProxyObject {
obj?: Index;
constructor(obj: Index) {
this.obj = obj;
}
syncCallback(res: string) {
if (this.obj) {
this.obj.changeMsg(res);
}
}
}
@Entry
@Component
struct Index {
private webviewController: WebviewController = new webview.WebviewController();
private localPath = $rawfile('index.html');
private javaScriptProxyObject = new JavaScriptProxyObject(this);
@State msg: string = '';
aboutToDisappear(): void {
this.webviewController.deleteJavaScriptRegister('javaScriptProxy');
}
changeMsg(msg: string) {
this.msg = msg;
}
build() {
Column() {
Web({ controller: this.webviewController, src: this.localPath })
.fileAccess(false)
.geolocationAccess(false)
.javaScriptAccess(true)
.javaScriptProxy({
object: this.javaScriptProxyObject,
name: 'javaScriptProxy',
methodList: ['syncCallback'],
controller: this.webviewController
})
.width('100%')
.height('70%');
Text(this.msg ? `JS返回的数据: ${this.msg}` : '')
.padding(20);
Button('获取异步函数返回值')
.onClick(() => {
this.webviewController.runJavaScript('asyncMethod(1, 2, "3")');
});
}
.width('100%')
.height('100%');
}
}