【问题标题】:Check if js.Value exists检查 js.Value 是否存在
【发布时间】:2021-11-16 17:38:28
【问题描述】:

在 JavaScript 代码中,我:

function readAll() {
    var objectStore = db.transaction("employee").objectStore("employee");
    
    objectStore.openCursor().onsuccess = function(event) {
       var cursor = event.target.result;
       
       if (cursor) {
          alert("Name for id " + cursor.key + ", Value: " + cursor.value);
          cursor.continue();
       } else {
          alert("No more entries!");
       }
    };
 }

在我等效的 GO 代码中,我写道:

    var ReadAll js.Func
    ReadAll = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
        defer ReadAll.Release()
        cursor := this.Get("result")

        if cursor {
                _ = cursor.Get("key")
                value := cursor.Get("value")
                Window.Call("alert", value)
                cursor.Call("continue")

            } else {
                Window.Call("alert", "No more records")
            } 
        return nil
    })

    db.ObjectStore.Call("openCursor").Set("onsuccess", ReadAll)

但是在编译时,我得到了:

non-bool cursor (type js.Value) used as if condition

我可以检查相关的js.value是否存在?

【问题讨论】:

  • this.Get("result") 将返回一个js.Value。您可以检查它是否为布尔值,并获取布尔值。不过,您的 Go 代码看起来不像 JS 代码。
  • 这个应该有webassembly标签吗?我没有看到 Go 特定的 WASM 标记
  • @BurakSerdar 返回的js.Value 不是bool,它是(key, Value) 的对象,而且我更改了代码行,希望现在清楚了。
  • @DanielFarrell 我不明白你的意思,但是我更新了上面的代码。
  • 如果要查看Get的结果是否为有效值,请查看cursor.Truthy()

标签: go webassembly


【解决方案1】:

javascript if(cursor) 正在检查值是否为truthy

您的代码this.Get 生成js.Value。它不是布尔值,您不能在 Go if 子句中使用它。

syscall/js 包有 Truthy(),您可以使用它来模仿 javascript 真实性检查。

https://pkg.go.dev/syscall/js#Value.Truthy

if cursor.Truthy() {
  ...
}

为了检查一个值是否为假,你可以否定结果:

if !cursor.Truthy() {
  ...
}

【讨论】:

    猜你喜欢
    • 2015-10-18
    • 2018-09-10
    • 2011-05-09
    • 2012-10-15
    • 2018-08-22
    • 2013-01-12
    • 2012-01-22
    • 2013-06-18
    • 2012-01-17
    相关资源
    最近更新 更多