【问题标题】:Blazor How should I get an `IJSObjectReference` when invoking a js function which may return `null`?Blazor 在调用可能返回 `null` 的 js 函数时,我应该如何获得 `IJSObjectReference`?
【发布时间】: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&lt;IJSObjectReference?&gt; 会发生什么,所以使用可空类型?否则,您可能需要检查 window.indexedDB 是否存在于不同的方法中
  • @noel 感谢您的建议。然而,可空类型不会改变任何内容,因为它只是编译时的检查。添加不同的方法是一种方式,但它确实会导致不必要的性能开销,所以我要求更好的做法。

标签: c# blazor blazor-webassembly asp.net-blazor


【解决方案1】:

几乎不是解决方案,但我只是通过返回 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;
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多