Nicolas Lepage 9c65a54a24
🚧
2019-11-27 07:22:07 +01:00

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)
}