mirror of
https://github.com/nlepage/go-wasm-http-server.git
synced 2025-03-10 17:29:10 +00:00
56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
package whutil
|
|
|
|
import (
|
|
"syscall/js"
|
|
)
|
|
|
|
// Promise is JS Promise
|
|
type Promise js.Value
|
|
|
|
// NewPromise creates a new JS Promise
|
|
func NewPromise(cb func(resolve, reject func(interface{}))) Promise {
|
|
var cbFunc js.Func
|
|
|
|
cbFunc = js.FuncOf(func(_ js.Value, args []js.Value) interface{} {
|
|
defer cbFunc.Release()
|
|
|
|
cb(
|
|
func(v interface{}) {
|
|
args[0].Invoke(v)
|
|
},
|
|
func(v interface{}) {
|
|
args[1].Invoke(v)
|
|
},
|
|
)
|
|
|
|
return js.Undefined()
|
|
})
|
|
|
|
return Promise(js.Global().Get("Promise").New(cbFunc))
|
|
}
|
|
|
|
// Await waits for the Promise to be resolved and returns the value
|
|
func (p Promise) Await() js.Value {
|
|
ch := make(chan js.Value)
|
|
p.Then(func(v js.Value) {
|
|
ch <- v
|
|
})
|
|
return <-ch
|
|
}
|
|
|
|
// Then calls cb with the value when the Promise is resolved
|
|
func (p Promise) Then(cb func(js.Value)) {
|
|
var then js.Func
|
|
then = js.FuncOf(func(_ js.Value, args []js.Value) interface{} {
|
|
defer then.Release()
|
|
cb(args[0])
|
|
return nil
|
|
})
|
|
js.Value(p).Call("then", then)
|
|
}
|
|
|
|
// Value returns the Promise as a js.Value
|
|
func (p Promise) Value() js.Value {
|
|
return js.Value(p)
|
|
}
|