例如,我有一个typescript中的模块,如:
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);
}
这不是一个解决方案,但我只是通过返回null而不是抛出异常来解决这个问题。然后,这可以在C#端捕获,并从那里返回null(或做任何事情(
// JS
function getXyz() {
if (xyz)
return xyz;
else
throw 'xyz does not exist';
}
// C#
public async ValueTask<IJSObjectReference> GetXyz()
{
try
{
return await jsRuntime.InvokeAsync<IJSObjectReference>('getXyz');
}
catch
{
return null;
}
}