【发布时间】:2022-09-28 05:26:17
【问题描述】:
我正在使用异步 IJSRuntime 在我的 WASM 项目中运行 JsInterrop 函数,并使用 JS 模块来加载该函数。
private readonly Lazy<Task<IJSObjectReference>> moduleTask;
public LocalJsInterop(IJSRuntime jsRuntime)
{
moduleTask = new(() => jsRuntime.InvokeAsync<IJSObjectReference>(
\"import\", \"./../_content/WebPlayerControls/localJsInterop.js\").AsTask());
}
然后像这样使用它来调用一个函数
public async ValueTask<string> GetWindowLocation()
{
var module = await moduleTask.Value;
string value = await module.InvokeAsync<string>(\"GetWindowLocation\");
return value;
}
我最近刚刚看到我可以使用 IJSInProcessRuntime 来同步运行该函数并尝试更改我的函数以使用它。
但我无法让我的模块工作。我试着像这样初始化它
module = jsRuntime.Invoke<IJSObjectReference>(\"import\", \"./../_content/WebPlayerControls/localJsInterop.js\");
但是它不会提供对同步 Invoke<> 的访问权限,而只能访问异步 InvokeAsync<>
我可能可以将这些函数放在 index.html 中以使用它们,但我想知道我是否仍然可以使用该模块。有人知道如何使导入模块以同步方式工作吗?
编辑
我尝试像这样使用 IJSInProcessObjectReference
private readonly Lazy<IJSInProcessObjectReference> moduleTask;
public LocalJsInterop(IJSInProcessRuntime jsRuntime)
{
moduleTask = new(() => jsRuntime.Invoke<IJSInProcessObjectReference>(\"import\", \"./../_content/WebPlayerControls/localJsInterop.js\"));
m_jsRuntime = jsRuntime;
}
public void ShowMessage()
{
var module = moduleTask.Value;
module.InvokeVoid(\"ShowMessage\");
}
但现在代码执行卡在 InvokeVoid 行。如果我尝试使用 InvokeVoidAsync,它会给出未找到函数的异常
-
您是否尝试过使用
IJSInProcessObjectReference代替? -
@MisterMagoo 我尝试使用但它不起作用,使用 Invoke 代码执行被卡住而没有抛出错误,而使用 InvokeAsync 它抛出一个错误,说找不到 js 函数
-
请使用您尝试过的完整代码更新您的问题
标签: blazor blazor-webassembly blazor-jsinterop