如何等待来自 golang wasm 的 js 异步函数?

问题描述

我写了一个小函数 await 来处理 go 中的异步 javascript 函数:

func await(awaitable js.Value) (ret js.Value,ok bool) {
    if awaitable.Type() != js.TypeObject || awaitable.Get("then").Type() != js.TypeFunction {
        return awaitable,true
    }
    done := make(chan struct{})


    onResolve := js.FuncOf(func(this js.Value,args []js.Value) interface{} {
        glg.Info("resolve")
        ret = args[0]
        ok = true
        close(done)
        return nil
    })
    defer onResolve.Release()

    onReject := js.FuncOf(func(this js.Value,args []js.Value) interface{} {
        glg.Info("reject")
        ret = args[0]
        ok = false
        close(done)
        return nil
    })
    defer onReject.Release()

    onCatch := js.FuncOf(func(this js.Value,args []js.Value) interface{} {
        glg.Info("catch")
        ret = args[0]
        ok = false
        close(done)
        return nil
    })
    defer onCatch.Release()


    glg.Info("before await")
    awaitable.Call("then",onResolve,onReject).Call("catch",onCatch)
    // i also tried go func() {awaitable.Call("then",onCatch)}()
    glg.Info("after await")
    <-done
    glg.Info("I never reach the end")
    return
}

问题是,当我使用或不使用 goroutine 调用该函数时,事件处理程序似乎被阻止,我被迫重新加载页面。我从未进入任何回调,我的频道从未关闭。有没有什么惯用的方法可以在 wasm 中调用来自 Golang 的 promise 的 await ?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)