为了账号安全,请及时绑定邮箱和手机立即绑定

等待 go 函数内的 js 异步函数(承诺)

等待 go 函数内的 js 异步函数(承诺)

Go
函数式编程 2022-09-12 20:56:36
我希望将索引数据库集成到一个基于wasm的应用程序中。你如何在go函数中“等待”来自js函数的承诺。下面是示例    async getItem(key) {        try{            const out = await database.getItem(key);            return out;        }catch(err){            return null;        }    }和在去func Get(key string)[]byte{    found :=  js.Global().Get("Store").Call('getItem', key )    // await for found    // convert js.Value to to []byte    return nil}异步回调也很好。LE:一个糟糕的解决方案是创建一个带有无限循环的 go 例程,等待 DOM 变量(如全局.solution+ID)被设置。但我认为这是一个糟糕的解决方案。
查看完整描述

2 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

您可以使用对象中的方法等待结果,如下所示:thenPromise


package main


import (

    "fmt"

    "syscall/js"

)


func main() {

    wait := make(chan interface{})

    js.Global().Call("sayHello", 5000).Call("then", js.FuncOf(func(this js.Value, args []js.Value) interface{} {

        fmt.Println(args[0])

        wait <- nil

        return nil

    }))

    <-wait

    fmt.Println("we're done here")

}

请注意,我们正在使用一个通道在 Go 代码中实际等待。我们需要这样做,因为 Go 程序在接收来自 Javascript 的回调时必须仍在运行。


文件:index.html


<html>

    <head>

        <meta charset="utf-8"/>

        <script src="wasm_exec.js"></script>

        <script>

            const go = new Go();

            WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).then((result) => {

                go.run(result.instance);

            });


            function sayHello(time) {

                return new Promise(resolve => {

                    console.log('waiting %dms and resolving', time)

                    setTimeout(() => resolve('hola!'), time)

                })

            }

        </script>

    </head>

    <body></body>

</html>


查看完整回答
反对 回复 2022-09-12
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

承诺,真实的例子(去.1.18):


type DevicesData struct {

    DeviceId string

    GroupId string

    Kind string

    Label string

}


list = make([]DevicesData, 0)

end := make(chan struct{})


// golang has a bug:

// enumerateDevices() returns an array, but, go returns an object.

forEach := js.FuncOf(func(_ js.Value, args []js.Value) any {

    data := DevicesData{

        DeviceId: args[0].Get("deviceId").String(),

        GroupId:  args[0].Get("groupId").String(),

        Kind:     args[0].Get("kind").String(),

        Label:    args[0].Get("label").String(),

    }

    list = append(list, data)


    // aways return nil

    return nil

})


// promise success function

var success = js.FuncOf(func(_ js.Value, args []js.Value) interface{} {

    args[0].Call("forEach", forEach)

    end <- struct{}{}


    // aways return nil

    return nil

})


var failure = js.FuncOf(func(this js.Value, args []js.Value) interface{} {

    err = errors.New(args[0].Get("message").String())


    // aways return nil

    return nil

})


js.Global().Get("navigator").Get("mediaDevices").Call("enumerateDevices").Call("then", success, failure)


// wait async call

<-end


查看完整回答
反对 回复 2022-09-12
  • 2 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信