【发布时间】:2022-12-31 01:15:18
【问题描述】:
例如,我在打字稿中有一个模块,例如:
export function getIndexedDb() : IDBFactory | null
{
if (window.indexedDB)
return window.indexedDB;
else
return null;
}
现在我想得到它的结果的 IJSObjectReference,所以我在 csharp 中试过这个:
await using var module = await jsRuntime.InvokeAsync<IJSObjectReference>("import", "xxxx.js");
await using var result = await module.InvokeAsync<IJSObjectReference>("getIndexedDb");
当有window.indexedDB时效果很好,但是当getIndexedDb()返回null时,会出现错误:
Uncaught (in promise) Error: Cannot create a JSObjectReference from the value 'null'.
(而且我什至无法在 csharp 中捕获异常。csharp 方法似乎只是在这里停止并且不会执行后面的代码。这是一个错误吗?)
那么我应该怎么做才能解决这个问题呢?我不相信下面的是个好主意:
class Nullable<T>
{
value: T | null;
constructor(value: T | null)
{
this.value = value;
}
getValue() : T | null
{
return this.value;
}
isNull() : boolean
{
return this.value === null;
}
}
export function getIndexedDb() : Nullable<IDBFactory>
{
if (window.indexedDB)
return new Nullable<IDBFactory>(window.indexedDB);
else
return new Nullable<IDBFactory>(null);
}
【问题讨论】:
-
如果你尝试
await module.InvokeAsync<IJSObjectReference?>会发生什么,所以使用可空类型?否则,您可能需要检查window.indexedDB是否存在于不同的方法中 -
@noel 感谢您的建议。然而,可空类型不会改变任何内容,因为它只是编译时的检查。添加不同的方法是一种方式,但它确实会导致不必要的性能开销,所以我要求更好的做法。
标签: c# blazor blazor-webassembly asp.net-blazor