Blazor当调用可能返回"null"的js函数时,我应该如何获得"IJSObjectRe



例如,我有一个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;
}
}

相关内容

  • 没有找到相关文章

最新更新